2016-04-29 36 views
11

我已经开始在mysql 5.7中使用JSON数据类型。有没有办法提取不带引号的值?例如,设置虚拟索引时。从MySQL中提取没有引号的值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      | 
+-----------------------------+ 

回答

1

我已经找到了解决方案,它是最干净的。 CAST功能没有工作,和@ Pryanshu的回答可以用

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

这不是安全的命令:'SELECT TRIM(BOTH'“''''\\”A \\“”')'结果是'\“A \'。 – MohaMad

+0

修剪不会纠正像(\“)这样的事情,它需要不加引号:) – Sep

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

这个工程!我唯一不喜欢它的地方是它假定了要提取的大小...... –

1

您可以使用CAST()函数从JSON对象转换为varchar

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

不幸的是,我试过,但这似乎并没有工作,虽然它看起来像一个干净的解决方案。如果我像VARCHAR一样投掷,它会给我错误1064(42000)。我可以像CHAR一样强制转换,但是它保留了引号......它在这里说VARCHAR被排除在允许的类型之外http://dev.mysql.com/doc/refman/5.7/en/cast- functions.html#function_cast –

+0

这不起作用。它会将它作为VARCHAR进行转换_with_ quotes – nkconnor

0

进行独立值长度也可以修改列本身,这样的行情是不是在生成列

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

您可以使用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\ 

我认为,所享有的在几乎所有情况下更好。

+0

这个答案在我看来是最好的,因为它会处理内部报价,比如”Hello \“Name \”“。 –

+1

(增加一个例子) –

12

您可以使用 - >>运算符来简单提取未引用的数据!其他

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

两种方式:

  • JSON_UNQUOTE(JSON_EXTRACT(柱,路径))
  • JSON_UNQUOTE(柱 - >路径)

注意:三种不同的方式产生的相同的命令,如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

注: - >>操作员被添加到MySQL 5.7.13