MariaDB的JSON_TABLE不会使用'$' json表达式选择整个文档

anhgbhbe  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(129)

最后我决定试一试这个强大的JSON_TABLE函数,我一直在到处看到,我有一个问题。
我找到的复制它的最小查询是:

SELECT * FROM JSON_TABLE('[{"foo":"bar","bar":5}]','$[*]' columns ( foo text path '$.foo' , bar int path '$.bar' , whole_row_json longtext path '$' )) AS x

或者甚至包裹得像

SELECT * FROM JSON_TABLE('{"data":[{"foo":"bar","bar":5}]}','$.data[*]' columns ( foo text path '$.foo' , bar int path '$.bar' , whole_row_json longtext path '$' )) AS x;

但是对于一个复杂的需求(和调试目的),我需要整个json文档在一个列中,但是我一直收到null
| 喷火|棒|整行json|
| - -|- -|- -|
| 棒|五个|零值|
我读了文档,甚至这个符号也用在了另一个答案上,所以,我试过另一个奇怪的符号(比如“$.”,“$*”,“$. *”),但似乎没有任何效果。
我错过了什么?
MariaDB版本:10.7.4
编辑:我需要的是生成每一行的json文档,而不是整个json输入
这个问题似乎是在https://jira.mariadb.org/browse/MDEV-25875上报告的,根据我的发现,这个问题在裸机mariadb 10.7.4和docker mariadb:10.6.8-focalmariadb:10.8mariadb:10.9-rc上都不起作用

1szpjjfi

1szpjjfi1#

尝试

SELECT * 
  FROM JSON_TABLE('[{"foo":"bar","bar":5}]',
       '$[*]' columns (
           foo text path '$.foo',
           bar int path '$.bar',
           whole_json JSON path '$'
       )) AS x;

我只是将数据类型从longtext更改为json。

更新

这在MariaDB 10.7.4上不起作用。

dgsult0t

dgsult0t2#

我记得您在path后面命名的路径必须是相对于json_table()正在处理的子对象的,您不能使用该路径来引用顶级JSON文档。
https://mariadb.com/docs/reference/mdb/functions/JSON_TABLE/表示:
常规列需要列的JSON路径表达式,该表达式用于在由行的JSON路径表达式生成的当前SQL/JSON项中搜索列
(强调我)
但是,您可以在json_table()函数之外创建文档,然后在select-list中引用它:

select x.*, j.myjson as whole_json 
from (select '[{"foo":"bar","bar":5}]' as myjson) as j
cross join json_table(j.myjson,
       '$[*]' columns (
           foo text path '$.foo',
           bar int path '$.bar'
       )) AS x;

| 喷火|棒|整个_json|
| - -|- -|- -|
| 棒|五个|[{“foo”:“bar”,“bar”:5}]|
https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=b42384efd007b2e09193397b92328c0c

相关问题