У него была похожая проблема, но он искал ключ, который мог бы быть обнуляемым, и интересовался, присутствовал ли ключ , хотя он был нулевым. Я обнаружил, что приведенный выше пример неверен в моем конкретном случае 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