我试图在Bigquery中使用JSON_EXTRACT
,而JSONPATH
并不总是相同。
因此,我的L.key始终是一个不同的关键字(我在表2中有此关键字)。不幸的是,concat
和JSON_EXTRACT
对我不起作用。
如果我单独使用concat,而不使用JSON_EXTRACT
,则可以使用。
这是我正在使用的代码:
SELECT A.*, SAFE_CAST(REPLACE(JSON_EXTRACT(A.some_json_obj, concat("$.", L.key)), '\"', '') AS NUMERIC) AS obp
FROM table1 A, table2 L
WHERE A.name = L.name
答案 0 :(得分:0)
以下是用于BigQuery标准SQL
要解决BigQuery对JsonPath的“限制”,您可以使用自定义函数,如下例所示:
#standardSQL
CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS STRING
LANGUAGE js AS """
try { var parsed = JSON.parse(json);
return JSON.stringify(jsonPath(parsed, json_path));
} catch (e) { returnnull }
"""
OPTIONS (
library="gs://your_bucket/jsonpath-0.8.0.js"
);
SELECT A.*,
SAFE_CAST(REGEXP_REPLACE(CUSTOM_JSON_EXTRACT(A.some_json_obj, CONCAT("$.", L.key)), r'["\[\]]', '') AS NUMERIC) AS obp
FROM table1 A, table2 L
WHERE A.name = L.name
注意:您需要从https://code.google.com/archive/p/jsonpath/downloads下载jsonpath-0.8.0.js并将其上传到您的Google Cloud Storage存储桶-在此示例中,其表示为gs://your_bucket/jsonpath-0.8.0。 js
例如,如果要应用于以下简化的虚拟数据
WITH table1 AS (
SELECT 1 name, '{"x":1, "y":"2"}' some_json_obj
), table2 AS (
SELECT 1 name, 'x' key UNION ALL
SELECT 1, 'y'
)
结果将是
Row name some_json_obj obp
1 1 {"x":1, "y":"2"} 1
2 1 {"x":1, "y":"2"} 2