mariadbjson中json表的正确使用

oymdgrw7  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(842)

我想转换一个名为 words 在一个名为 data_table 放进table里。栏目内容为:

{"123456":{"first":"hello","second":"there"},
 "78910":{"first":"All good?"}
}

我想达到这样的效果:

ID     | word     |
-------+----------|
123456 |hello     |
-------+----------|
78910  |All good? |

我试过这个:

SELECT * FROM data_table t1,
JSON_TABLE( t1.words, '$.123456.*' COLUMNS (word PATH '$.first')) AS jt;

但它返回一个#1064mysql语法错误。错误在哪里???
完整的错误代码(德语翻译):

Error in the SQL-Syntax. Please consult the manual for the correct syntax near '( t1.words, '$.123456.*' COLUMNS (word PATH '$.first')) AS jt LIMIT 0, 25' in line 2

此外,我还注意到本页的基本示例:

SELECT *
FROM
JSON_TABLE(
    '[ {"c1": null} ]',
    '$[*]' COLUMNS( c1 INT PATH '$.c1' ERROR ON ERROR )
) as jt;

还返回#1064语法错误(从德语翻译):


# 1064 - There's an error in your SQL-Syntax. Please consult the manual for the correct syntax near '(

    '[ {"c1": null} ]',
    '$[*]' COLUMNS( c1 INT PATH '$.c1' ERROR ON E...' on line 3

怎么了???顺便说一句,我的主机说我的mysql版本是10.3-mariadb。。
更新
不管我在这里尝试什么,我总是得到一个#1064mysql语法错误,告诉我在{后面的任何东西}附近更正我的语法 JSON_TABLE( 在我的声明中。怎么了?
根据这一点,json\ U表真的不适合我吗??

rryofs0p

rryofs0p1#

实际上,mariadb系统似乎不支持mysql服务器中支持的json\u表函数。。。
不过,我的主机声称他的“mysql版本”是“10.3-mariadb”,所以我有点困惑;我被告知他们有相同的功能,看起来我是被误导了?从我在网上看到的情况来看,mariadb似乎是mysql的一个重新实现,它改进了mysql服务器的很多特性,但是缺少一些特性,比如json_table函数。这是正确的,还是我在这里误解了什么,我真的应该能够使用json_table函数?

o2gm4chl

o2gm4chl2#

从你的案子来看,mariadb不支持 JSON_TABLE() 功能。可以通过在json数据中使用 JSON_KEYS() 以及 JSON_LENGTH() 在具有辅助表(如from)的查询中递归地执行函数 information_schema 例如 information_schema.tables ,并使用 JSON_QUERY() 带索引( CONCAT('$.',ID) )确定元素的值 first ,那么 JSON_EXTRACT() 为了提取所需的部分,最后 JSON_UNQUOTE() 要去掉双引号:

WITH t1 AS
(
SELECT @i := @i + 1 AS rn, 
       JSON_UNQUOTE( JSON_EXTRACT( JSON_KEYS(jsdata),CONCAT('$[',@i,']')) ) AS ID,
       jsdata
  FROM information_schema.tables AS t1 
 CROSS JOIN (SELECT @i := -1, t.* FROM t) AS t2 -- t is your original table
 WHERE @i < JSON_LENGTH( JSON_KEYS(jsdata) ) - 1
) 
SELECT t1.ID, 
       JSON_UNQUOTE( JSON_EXTRACT( JSON_QUERY(jsdata, CONCAT('$.',ID)) ,"$.first") ) AS word
  FROM t1

演示

相关问题