web-dev-qa-db-fra.com

Comment convertir un tableau stratifié en tableau dans BigQuery?

Il se trouve que j'ai un tableau stratifié dans un champ de BigQuery

'["a","b","c"]'

et je veux le convertir en un tableau que BigQuery comprend. Je veux pouvoir le faire en SQL standard:

with k as (select '["a","b","c"]' as x)
select x from k, unnest(x) x

J'ai essayé JSON_EXTRACT('["a","b","c"]','$') et tout le reste que j'ai pu trouver en ligne.

Des idées?

12
BorHna

Ci-dessous, pour BigQuery Standard 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

Il transforme votre colonne de chaîne en colonne de tableau

16
Mikhail Berlyant

Ce serait beaucoup plus facile via 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

Je veux proposer une alternative. Comme le tableau est une chaîne, extrayez simplement la valeur en utilisant regexp_extract_all:

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

Vous pouvez trouver l'expression rationnelle trop restrictive pour commencer par un alphanumérique; vous pouvez simplement le modifier à votre guise.

1
Ben Haanstra

Cette solution met à jour la réponse de @ northtree et gère plus élégamment le retour des membres du tableau en tant qu'objets JSON stringifiés que le renvoi de [object Object] chaînes:

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