尝试使用变量路径名时出错:JSONPath 必须是字符串文字或查询参数

cor*_*234 5 google-bigquery

我试图JSON_EXTRACT在 Bigquery 中使用JSONPATH并不总是相同的。

所以我的 L.key 总是一个不同的关键字(我在 table2 中有)。不幸的是,concatwithJSON_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
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 6

以下是 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
Run Code Online (Sandbox Code Playgroud)

注意:您需要从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'
)
Run Code Online (Sandbox Code Playgroud)

结果将是

Row name    some_json_obj       obp  
1   1       {"x":1, "y":"2"}    1    
2   1       {"x":1, "y":"2"}    2    
Run Code Online (Sandbox Code Playgroud)