2017-11-30 11 views
1

Iを返す以下のクエリBigQuery JSON構造体の値の合計を取得するにはどうすればよいですか?

SELECT 
    JSON_EXTRACT(json, '$.Weights') as weight 
from 
(select '{"Weights":{"blue":1.0,"purple":0.0,"yellow":1.0,"green":1.0}}' as json) 

有する:

{ "青"、1.0 "紫色":0.0、 "黄色":1.0、 "緑":1.0}

合計の色はすべてです。戻るには意味:

3.0

私は、任意の成功なしに分割し、アンネスト機能を使用して任意の提案をしようとしていますか?ありがとう。ここ

答えて

1

REGEXP_EXTRACT_ALLを用いた例である: - :の値のペアの他のオプションを探索のために

WITH T AS (
    SELECT '{"Weights":{"blue":1.0,"purple":0.0,"yellow":1.0,"green":1.0}}' AS json 
) 
SELECT 
    (
    SELECT SUM(CAST(val AS FLOAT64)) 
    FROM UNNEST(
     REGEXP_EXTRACT_ALL(
     JSON_EXTRACT(json, '$.Weights'), 
     r':([^,}]+)') 
    ) AS val 
) 
FROM T; 
+0

作業には最適です。どうもありがとう ! – tototl

1

以下

BigQueryの標準SQLのため

まず例キーを抽出することですこれはRの下にあなたを与える各行

#standardSQL 
WITH `project.dataset.yourTbale` AS (
    SELECT 1 AS id, '{"Weights":{"blue":1.0,"purple":0.0,"yellow":1.0,"green":1.0}}' AS json 
    UNION ALL SELECT 2, '{"Weights":{"blue":1.0,"red":2.0,"yellow":1.0,"orange":3.0}}' 
) 
SELECT id, 
    REPLACE(SPLIT(pair, ':')[OFFSET (0)], '"', '') color, 
    SAFE_CAST(SPLIT(pair, ':')[OFFSET (1)] AS FLOAT64) value 
FROM `project.dataset.yourTbale`, 
UNNEST(SPLIT(REGEXP_REPLACE(JSON_EXTRACT(json, '$.Weights'), r'{|}', ''))) pair 

if there is a way to sum up all the values of the colorsのあなたの元の質問に上記の拡張、さらには潜在的に特定の色(複数可)をフィルタリングしてより多くのそれを拡張することは簡単ですので、今

id color value  
1 blue 1.0 
1 purple 0.0 
1 yellow 1.0 
1 green 1.0 
2 blue 1.0 
2 red  2.0 
2 yellow 1.0 
2 orange 3.0 

をesult - 結果としてで

#standardSQL 
WITH `project.dataset.yourTbale` AS (
    SELECT 1 AS id, '{"Weights":{"blue":1.0,"purple":0.0,"yellow":1.0,"green":1.0}}' AS json 
    UNION ALL SELECT 2, '{"Weights":{"blue":1.0,"red":2.0,"yellow":1.0,"orange":3.0}}' 
) 
SELECT id, 
    SUM(SAFE_CAST(SPLIT(pair, ':')[OFFSET (1)] AS FLOAT64)) AS total 
FROM `project.dataset.yourTbale`, 
UNNEST(SPLIT(REGEXP_REPLACE(JSON_EXTRACT(json, '$.Weights'), r'{|}', ''))) pair 
WHERE REPLACE(SPLIT(pair, ':')[OFFSET (0)], '"', '') != 'blue' 
GROUP BY id 

以下の例を参照してください(計算から色=青を除く)

id total  
1 2.0 
2 6.0 
+0

これは非常にうまく動作します、あなたの答え、ミハイルのおかげで! – tototl

関連する問題