如何使用Presto JSON函数访问字段名中带有“~”的json字段

6
我在我的json字段中有一个“~”,例如“~id”。使用Presto 0.75时,我无法访问这样的字段。以下是我尝试了但没有成功的内容:
SELECT json_extract_scalar('{"id":"1","table":"test"}', '$.table'); // 这个有效
SELECT json_extract_scalar('{"id":"1","~table":"test"}', '$.[\"~table\"]'); // 无效
SELECT json_extract_scalar('{"id":"1","~table":"test"}', '$.[\~table]'); // 无效
错误提示为“无效的JSON路径:”

2
你尝试过使用 '$[~table]' 或者 '$["~table"]' 吗? - Grundy
1个回答

12

该JSON路径的正确形式为:'$["~table"]'

presto> SELECT json_extract_scalar('{"id":"1","~table":"test"}', '$["~table"]');

 _col0 
-------
 test  
(1 row)

以下是一些事实,以帮助您理解为什么您尝试的替代方法不起作用:
- JSON路径表达式用SQL字符串表示。唯一需要转义的字符是字符串定界符(即单引号),并且您需要使用另一个单引号来完成它。例如:'don''t'don't的SQL字符串字面量。 SQL字符串字面量中的双引号不需要转义。 - JSON路径表达式支持两种形式的访问属性:字段与数组元素访问。如果您有一个名为“foo”的属性,则可以使用'$ ["foo"]''$.foo'访问它。字段访问语法仅适用于名称为有效标识符(字母数字和下划线)的情况。

同样的概念也适用于"-"连接符或破折号字符。我在依赖于 Presto JSON 函数的 AWS Athena 中遇到了类似的问题。 - shamanth Gowdra Shankaramurthy
以防您不知道,像这样访问嵌套元素的数组元素 {"foo":{"~bar":1}},应该像这样:$["foo"]["~bar"] - nbarraille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接