BigQueryのフィールドに文字列化された配列がある
_'["a","b","c"]'
_
bigQueryが理解できる配列に変換したいと思います。これを標準SQLで実行できるようにしたい:
_with k as (select '["a","b","c"]' as x)
select x from k, unnest(x) x
_
私はJSON_EXTRACT('["a","b","c"]','$')
を試しましたが、他にオンラインで見つけることができます。
何か案は?
以下はBigQuery標準SQL用です
#standardSQL
WITH k AS (
SELECT 1 AS id, '["a","b","c"]' AS x UNION ALL
SELECT 2, '["x","y"]'
)
SELECT
id,
ARRAY(SELECT * FROM UNNEST(SPLIT(SUBSTR(x, 2 , LENGTH(x) - 2)))) AS x
FROM k
文字列列を配列列に変換します
JS
[〜#〜] udf [〜#〜] を使用すると、はるかに簡単になります。
CREATE TEMP FUNCTION
JSON_EXTRACT_ARRAY(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(input);
""";
WITH
k AS (
SELECT
'["a","b","c"]' AS x)
SELECT
JSON_EXTRACT_ARRAY(x) AS x
FROM
k
代わりを提供したいと思います。配列は文字列であるため、regexp_extract_allを使用して値を抽出するだけです。
REGEXP_EXTRACT_ALL(your_string, r'[0-9a-zA-Z][^"]+') as arr
正規表現は、英数字で始めるには制限が多すぎると感じるかもしれません。好みに合わせて調整してください。
このソリューションは@northtreeの回答を更新し、[object Object]
文字列を返すのではなく、配列のメンバーを文字列化されたJSONオブジェクトとして返すことをよりエレガントに処理します。
CREATE TEMP FUNCTION
JSON_EXTRACT_ARRAY(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(input).map(x => JSON.stringify(x));
""";
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7}, 456]' as body
)
select
id,
entry,
json_extract(entry, '$'),
json_extract(entry, '$.a'),
json_extract(entry, '$.b')
from
raw,
unnest(json_extract_array(body)) as entry