web-dev-qa-db-ja.com

文字列化された配列をBigQueryの配列に変換する方法

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"]','$')を試しましたが、他にオンラインで見つけることができます。

何か案は?

12
BorHna

以下は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

文字列列を配列列に変換します

16

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
1
northtree

代わりを提供したいと思います。配列は文字列であるため、regexp_extract_allを使用して値を抽出するだけです。

REGEXP_EXTRACT_ALL(your_string, r'[0-9a-zA-Z][^"]+') as arr

正規表現は、英数字で始めるには制限が多すぎると感じるかもしれません。好みに合わせて調整してください。

1
Ben Haanstra

このソリューションは@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
0
Ryan Tuck