मेरे पास निम्न क्वेरी है

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
tototl 30 नवम्बर 2017, 19:36

2 जवाब

सबसे बढ़िया उत्तर

यहां 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;
1
Elliott Brossard 30 नवम्बर 2017, 19:53

अन्य विकल्प तलाशने के लिए-

नीचे BigQuery मानक SQL के लिए है

पहला उदाहरण कुंजी निकालना है: प्रत्येक पंक्ति के लिए मूल्य जोड़ी

#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

यह आपको नीचे परिणाम देता है

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  

तो अब यह आपके if there is a way to sum up all the values of the colors के मूल प्रश्न के ऊपर विस्तार करना आसान है और विशिष्ट रंगों पर संभावित रूप से फ़िल्टरिंग के साथ इसे और भी विस्तारित करना - नीचे उदाहरण देखें

#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   
1
Mikhail Berlyant 30 नवम्बर 2017, 22:40