Google bigquery 尝试使用变量pathsname时出错:JSONPath必须是字符串文字或查询参数

Google bigquery 尝试使用变量pathsname时出错:JSONPath必须是字符串文字或查询参数,google-bigquery,Google Bigquery,我试图在Bigquery中使用JSON\u EXTRACT,并使用一个不总是相同的JSONPATH 所以我的L.key总是一个不同的关键字(我在表2中有)。不幸的是,concat和JSON\u EXTRACT对我不起作用。 如果我单独使用concat,而不使用JSON\u EXTRACT,它就可以工作 这是我正在使用的代码: SELECT A.*, SAFE_CAST(REPLACE(JSON_EXTRACT(A.some_json_obj, concat("$.", L.key)), '\"'

我试图在Bigquery中使用
JSON\u EXTRACT
,并使用一个不总是相同的
JSONPATH

所以我的L.key总是一个不同的关键字(我在表2中有)。不幸的是,
concat
JSON\u EXTRACT
对我不起作用。
如果我单独使用concat,而不使用
JSON\u 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

下面是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
注意:您需要从下载jsonpath-0.8.0.js并将其上载到您的Google云存储桶中-在本例中,它表示为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    

Hi@corianne1234,因为错误消息JSONPath中的状态必须是[8:8]处的字符串文字或查询参数。我理解,您试图做的事情在某种程度上与动态SQL功能相关,而BigQueryTanks目前不太支持动态SQL功能。但甚至没有…JSON_提取(查询,concat(“$”,“xy”)。。。有效,这是一个字符串文字还是我错了?concat函数的输出是文字,这是正确的,但在JSON_EXTRACT中调用函数是您面临的问题。这就是为什么在没有concat的情况下执行“$.xy”时,它会工作的原因fine@corianne1234-你的利率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,您可以提高自己的声誉分数,同时让我们有动力回答您的问题:o)Mikhail Berlyant
JSON_EXTRACT
JSON_EXTRACT_SCALAR
是否仍然存在此限制?