BigQuery查询含连字符的JSON字段出现未识别名称错误求助
BigQuery查询JSON列含连字符字段的解决办法
在BigQuery里,JSON字段名带连字符时,直接用点语法(.)访问会触发解析错误——因为连字符会被当成减号运算符,导致系统识别不了字段名,出现你遇到的"Unrecognized name"报错。
解决这个问题有两种常用方式:
1. 方括号+引号访问字段
把带特殊字符的字段名用双引号包裹,放在方括号里,替代点语法。比如你示例里的last-updated、processing-timestamp字段,访问方式如下:
SELECT value.timestamp, value.header.source, -- 访问带连字符的processing-timestamp字段 value.header["processing-timestamp"], -- 访问last-updated下的嵌套特殊键 value.header["last-updated"]["comps/com[name=TorontoCA]/properties/property[name=uptime]"] AS toronto_uptime FROM `mydataset.test_table`
2. 使用JSON_EXTRACT_SCALAR函数
如果只需要提取字段的标量值(字符串、数字等),可以用JSON_EXTRACT_SCALAR函数,传入JSON列和标准JSON路径即可,路径里的带连字符字段无需额外转义:
SELECT JSON_EXTRACT_SCALAR(value, '$.timestamp') AS timestamp, JSON_EXTRACT_SCALAR(value, '$.header.source') AS source, JSON_EXTRACT_SCALAR(value, '$.header.processing-timestamp') AS processing_timestamp, -- 嵌套的特殊键需要用双引号包裹 JSON_EXTRACT_SCALAR(value, '$.header.last-updated."comps/com[name=TorontoCA]/properties/property[name=uptime]"') AS toronto_uptime FROM `mydataset.test_table`
另外注意你原查询里的问题:重复写了value.header.source,而且transaction-id字段在你提供的示例JSON里不存在,可能是笔误,需要确认实际字段名是否正确。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

