Google Big Query проверяет, существует ли ключ json - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть столбец Google Big Query Table, который содержит строку json. Со временем в эту строку json были введены новые ключи.

time              col_b     
--------------------------------------------------
timestamp3        {"key1": "value", "key2": "value"}
timestamp2        {"key1": "value"}
timestamp1        {"key1": "value"}

Как извлечь key2 и, если его нет, заполнить NaN? Я подумал о чем-то вроде:

SELECT 
    JSON_EXTRACT(col_b, "$.key2) AS key2
FROM db;

. Это приведет к ошибке, поэтому она думает, что она должна быть двойной, а не строковой причиной нулевых значений.

Bad double type: value

Как я могу заранее проверить, существует ли key2 и если он не заполнен нулем?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

См. Пример ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'timestamp3' time, '{"key1": "value", "key2": "value"}' col_b UNION ALL
  SELECT 'timestamp2', '{"key1": "value"}' UNION ALL
  SELECT 'timestamp1', '{"key1": "value"}' 
)
SELECT *, IFNULL(JSON_EXTRACT_SCALAR(col_b, '$.key2'), 'NaN') AS key2
FROM `project.dataset.table`

с выводом

Row time        col_b                               key2     
1   timestamp3  {"key1": "value", "key2": "value"}  value    
2   timestamp2  {"key1": "value"}                   NaN  
3   timestamp1  {"key1": "value"}                   NaN  
0 голосов
/ 27 апреля 2020

У него была похожая проблема, но он искал ключ, который мог бы быть обнуляемым, и интересовался, присутствовал ли ключ , хотя он был нулевым. Я обнаружил, что приведенный выше пример неверен в моем конкретном случае c, вот мой пример ниже - надеюсь, кто-то найдет его полезным.

#standardSQL
CREATE TEMPORARY FUNCTION
  jsonHasKey(libs STRING, key STRING)
  RETURNS BOOL
  LANGUAGE js AS '''
      try {
        x = JSON.parse(libs);        
        return x.hasOwnProperty(key);
      } catch (e) {
        return false;
      }
    ''';

WITH `project.dataset.table` AS (
  SELECT 'timestamp3' time, '{"key1": "value", "key2": "value"}' col_b UNION ALL
  SELECT 'timestamp2', '{"key1": "value"}' UNION ALL
  SELECT 'timestamp1', '{"key1": "value"}' UNION ALL
  SELECT 'timestamp0', '{"key1": "value", "key2": null}'
)

SELECT *, IFNULL(JSON_EXTRACT_SCALAR(col_b, '$.key2'), 'NaN') AS key2, jsonHasKey(col_b, 'key2') AS is_present
FROM `project.dataset.table`

, который дает следующие результаты:

time        col_b                                           key2    is_present
timestamp3  "{""key1"": ""value"", ""key2"": ""value""}"    value   true
timestamp2  "{""key1"": ""value""}"                         NaN     false
timestamp1  "{""key1"": ""value""}"                         NaN     false
timestamp0  "{""key1"": ""value"", ""key2"": null}"         NaN     true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...