从MySQL JSON数据类型中提取不带引号的值

ldxq2e6h  于 2023-08-08  发布在  Mysql
关注(0)|答案(9)|浏览(125)

我已经开始在mysql 5.7中使用JSON数据类型。有没有一种方法可以提取一个没有引号的值?例如,当设置虚拟索引时。
范例:

mysql> INSERT INTO test (data) VALUES ('{"type": "user" , 
"content" : { "username": "jdoe", "firstname" : "John", "lastname" : "Doe" } }');

mysql> SELECT json_extract(data,'$.type') FROM test;
+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| "user"                      |
+-----------------------------+

字符串
如何到达

+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| user                        |
+-----------------------------+


qvtsj1bj

qvtsj1bj1#

您可以使用->>运算符提取未加引号的数据,非常简单!

SELECT JSONCOL->>'$.PATH' FROM tableName

字符串
另外两种方式:

  • JSON_UNQUOTE(JSON_EXTRACT(column, path))
  • JSON_UNQUOTE(column->path)

注意:三种不同的方式产生相同的命令,如EXPLAIN所解释的:
与->一样,->>运算符始终在EXPLAIN的输出中展开,如以下示例所示:

EXPLAIN SELECT c->>'$.name' AS name FROM jemp WHERE g > 2 ;
SHOW WARNINGS ;
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select
json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from
`jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
1 row in set (0.00 sec)


阅读更多MySQL参考手册https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#operator_json-inline-path
注意:->>运算符是在MySQL5.7.13中增加的

3zwjbxry

3zwjbxry2#

可以使用JSON_UNQUOTE()方法:

SELECT JSON_UNQUOTE(json_extract(data,'$.type')) FROM test;

字符串
此方法将处理内部引号,例如:

SET @t1 := '{"a": "Hello \\\"Name\\\""}';
SET @j := CAST(@t1 AS JSON);
SET @tOut := JSON_EXTRACT(@j, '$.a');
SELECT @t1, @j, @tOut, JSON_UNQUOTE(@tOut), TRIM(BOTH '"' FROM @tOut);


将给予:

@t1     : {"a": "Hello \"Name\""}
@j      : {"a": "Hello \"Name\""}
@tOut   : "Hello \"Name\""
unquote : Hello "Name"
trim    : Hello \"Name\


我相信,在几乎所有的情况下,非引号都是更好的。

mmvthczy

mmvthczy3#

另一种方法是;

SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.type')) FROM test

字符串

eit6fx6z

eit6fx6z4#

MySQL 8.0.21支持JSON_VALUE函数
从指定文档中给定的路径处的JSON文档中提取值,并返回提取的值,并选择将其转换为所需类型。完整的语法如下所示:

JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
on_empty:
       {NULL | ERROR | DEFAULT value} ON EMPTY
on_error:
       {NULL | ERROR | DEFAULT value} ON ERROR

字符串
如果RETURNING子句未指定,则JSON_VALUE()函数的返回类型为VARCHAR(512)

**db<>fiddle demo**第一个字符

SELECT json_value(data,'$.type')
FROM test;
-- user

vhmi4jdf

vhmi4jdf5#

可以使用CAST()函数将json对象转换为varchar

SELECT CAST(json_extract(data,'$.type') AS VARCHAR) FROM test;

字符串

t2a7ltrp

t2a7ltrp6#

当我在数据库中存储了一个字符串时,我偶然发现了这一点,这是一个JSON对象-这就是你如何将整个原始对象提取到另一个对象中:

set @json = '{"a":1}';
select json_object('object', json_extract(@json, '$'));

字符串
这个返回

{"object": {"a": 1}}

8fq7wneg

8fq7wneg7#

SELECT left(right(json_extract(data,'$.type'),5),4) FROM test;

字符串

kx1ctssn

kx1ctssn8#

也可以修改列本身,使引号不在生成的列中

alter table your_table add your_field varchar(25) GENERATED ALWAYS AS (TRIM(BOTH '"' FROM json_extract(json_field,'$.your_field')))

字符串

hmmo2u0o

hmmo2u0o9#

我找到了一个最干净的方法。CAST函数不起作用,并且@Pryanshu的答案可以通过使用独立于值长度

SELECT TRIM(BOTH '"' FROM json_extract(data,'$.type')) FROM test;

字符串

相关问题