1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SnowflakeでのJSON内のテキストデータの扱い方で気づいたこと(AS_VARCHAR)

Last updated at Posted at 2024-08-31

以前、「SnowflakeのFLATTEN、完全に理解した」とか言って以下の投稿をしました。

その際には件数だけを書いていて実データについては書いてはいないのですが、
JSONデータをselectすると、テキストデータはダブルクォーテーションで囲って出力されたんです。

再現してみます。

準備

--DB作成
create database TEST_DB;
--スキーマ作成
create schema TEST_SCHEMA;
--JSONテスト用テーブル作成
create table TEST_JSON(JSON_DATA VARIANT) COMMENT='JSONテスト用テーブル';
--テストデータを3件INSERT
INSERT INTO TEST_JSON SELECT TO_VARIANT(PARSE_JSON('{"id":"A1","object":"A","amount":100}'));
INSERT INTO TEST_JSON SELECT TO_VARIANT(PARSE_JSON('{"id":"B1","object":"B","amount":200}'));
INSERT INTO TEST_JSON SELECT TO_VARIANT(PARSE_JSON('{"id":"B2","object":"B","amount":10}'));
--INSERT結果確認
select * from TEST_JSON;

スクリーンショット 2024-08-31 094034.png
データ入ってますね。
ダブルクォーテーション、気になります。

JSONを分解して出力します。

--JSONを分解
select
    t1.JSON_DATA:amount as amount,
    t1.JSON_DATA:id as id,
    t1.JSON_DATA:object as object
from TEST_JSON t1;

スクリーンショット 2024-08-31 094421.png
ここで”A1”というようにテキストの値はダブルクォーテーションが付いてきます。
数値項目と解釈されているAmountの値はそのままです。

実際データとして使う時に邪魔だなーと思い、
replace(対象カラム,'"') as なんちゃら
というようにダブルクォーテーションを除去するようにしてました。

思い付き実装で対応

--replace関数をかます
select
    t1.JSON_DATA:amount as amount,
    replace(t1.JSON_DATA:id,'"') as id,
    replace(t1.JSON_DATA:object,'"') as object
from TEST_JSON t1;

スクリーンショット 2024-08-31 094529.png
求めていた結果としては正しい。

追記です。
ひょっとしてreplace関数だとダブルクォーテーションは除去できても実は型はVariantのままなのでは?と疑問に思い再度確認したところ、textってなってました。
スクリーンショット 2024-09-11 101535.png
黄色に塗ったところ、Aにカーソルを乗せると「text」となっていました。
replace関数をかます前の結果の"A1"の値の方は「variant」となっています。
replace関数をかますことで文字列型へのキャストが行われていることが確認できました。
間違ったことを書いてなくてよかったです。

でも、「これってなんかもっとスマートにやる方法があるはず。
こんな泥臭いことをわざわざやるなんて、そんなわけない。」
って思ってたんです。(思ってたけど放置。)

で、UdemyでSnowPro対策の講座見ていて発見しました。↓
スクリーンショット 2024-08-31 100952.png

AS_VARCHAR(対象カラム) as なんちゃら

うおー、顧客が求めていたもの。
これで行けました。

発見した技(これが正解)

select
    t1.JSON_DATA:amount as amount,
    AS_VARCHAR(t1.JSON_DATA:id) as id,
    AS_VARCHAR(t1.JSON_DATA:object) as object
from TEST_JSON t1;

スクリーンショット 2024-08-31 094657.png

おしまい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?