我已经开始在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 |
+-----------------------------+
答案 0 :(得分:41)
您可以使用 - >>运算符只是提取不带引号的数据!
SELECT JSONCOL->>'$.PATH' FROM tableName
另外两种方式:
注意:同一命令有三种不同的方式,EXPLAIN
解释:
与 - >一样, - >> operator始终在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
的内容注意: - >>运算符已添加到MySQL 5.7.13
中答案 1 :(得分:38)
您可以使用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\
我相信在几乎所有情况下,unquote都会更好。
答案 2 :(得分:3)
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)
SELECT json_value(data,'$.type')
FROM test;
-- user
答案 3 :(得分:2)
另一种方法是;
SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.type')) FROM test
答案 4 :(得分:0)
您可以使用CAST()函数将json对象转换为varchar
SELECT CAST(json_extract(data,'$.type') AS VARCHAR) FROM test;
答案 5 :(得分:-1)
SELECT left(right(json_extract(data,'$.type'),5),4) FROM test;
答案 6 :(得分:-1)
您还可以修改列本身,以便引号不在生成的列中
alter table your_table add your_field varchar(25) GENERATED ALWAYS AS (TRIM(BOTH '"' FROM json_extract(json_field,'$.your_field')))
答案 7 :(得分:-2)
我找到了一个最干净的解决方案。 CAST功能不起作用,@ Pryanshu的答案可以通过使用
独立于值长度SELECT TRIM(BOTH '"' FROM json_extract(data,'$.type')) FROM test;