如何在MySQL中搜索JSON数据?


81

我正在使用将数据插入数据库json_encoded。现在,我要搜索“功能”,但不能。

MySQL查询:

SELECT  `id` ,  `attribs_json` 
FROM  `products` 
WHERE  `attribs_json` REGEXP  '"1":{"value":[^"3"$]'

该查询向我显示所有键为“ 1”且值是任何东西而不是“ 3”的行

我的数据是:

{"feature":{"1":{"value":"["2","3"]"},
            "2":{"value":["1"]},
            "5":{"value":""},
            "3":{"value":["1"]},
            "9":{"value":""},
            "4":{"value":"\u0633\u0627\u062a\u0646"},
            "6":{"value":""},
            "7":{"value":""},
            "8":{"value":""}
           },
"show_counter":"0",
"show_counter_discount":""
}}

我想告诉我所有记录,键为“ 1”,“ 3”为值之一
reza 2015年

解释“不能”!你得到什么输出?
2015年

我想显示所有功能ID为1且功能值之一为3的产品。Feature是这样的数组:feature = array(1 => array(1,2,3),2 => array(1,4,7 ))我正在使用jsonencode将其保存到数据库
reza

这听起来像一个可怕的主意。通过将要过滤的数据分成自己的列,然后仅将JSON内容用于不会过滤的其他信息,您将受益。
diggersworld,2015年

为什么是可怕的主意。这有什么缺点?
reza

Answers:


138

如果您的MySQL版本> = 5.7,则可以尝试以下操作:

SELECT JSON_EXTRACT(name, "$.id") AS name
FROM table
WHERE JSON_EXTRACT(name, "$.id") > 3

输出:

+-------------------------------+
| name                          | 
+-------------------------------+
| {"id": "4", "name": "Betty"}  | 
+-------------------------------+


请查看MySQL参考手册以获取更多详细信息:https :
//dev.mysql.com/doc/refman/5.7/en/json-search-functions.html


2
重要说明:json_encode将整型另存为双整数值(因此-string类型)。如果寻找平等的, JSON_EXTRACT(name, "$.id") = "4"必须用来代替JSON_EXTRACT(name, "$.id") = 4
阿尔尼斯Juraga

9
>在MySQL 5.7.9及更高版本中,当与两个参数一起使用时,->运算符用作JSON_EXTRACT()函数的别名。然后SELECT name->"$.id" as name FROM table WHERE name->"$.id" > 3 ,您的示例变为:就 我个人而言,我觉得这很容易理解。
罗宾·范·巴伦

24

如果您使用的是MySQL最新版本,则可以帮助您满足要求。

select * from products where attribs_json->"$.feature.value[*]" in (1,3)

6
最新的mysql版本是什么意思?支持什么版本?
塞尔吉奥

IN运算符支持什么版本?
塞尔吉奥

2
MySQL的5.5及以上@塞尔吉奥
毗Prasanthģ

1
mysql --version mysql Ver 14.14 Distrib 5.7.18,适用于Linux(x86_64)警告:(1235,“此版本的MySQL尚不支持'在IN运算符中比较JSON'”)
Sérgio17年

11
  1. 在数据库中存储JSON违反了第一种规范形式。

    您可以做的最好的事情就是将功能标准化并存储在另一个表中。然后,您将可以使用外观更好的联合查询。您的JSON甚至类似于表格。

  2. Mysql 5.7具有内置的JSON功能:http :
    //mysqlserverteam.com/mysql-5-7-lab-release-json-functions-part-2-querying-json-data/

  3. 正确的模式是:

    WHERE  `attribs_json` REGEXP '"1":{"value":[^}]*"3"[^}]*}'
    

    [^}] 将匹配任何字符,除了 }


2
同意上面的#1,但有时您遇到这样的情况,在设计时,表上的字段名很少。在这种情况下,可以通过在表上使用JSON数据类型来混合关系数据存储和Nosql数据存储。
chrisl08

10

我用这个查询

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])key_word([^"])"';
or
SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_word[[:>:]]"';

我使用它来搜索部分值的第一个查询。我使用第二个查询来搜索确切的单词。


MySQL 5.7终于有了JSON支持。但是,该更新成为主流仍需要一段时间,但是作为快速参考,这是提取某些信息的简便方法。谢谢!
tmarois

它对我不起作用。我有结构等{"images":"-"}SELECT id FROM parsed_redfin WHERE data` RLIKE ' “图像”: “[[:<:]] - [[:>:]]”';`不返回任何东西
Volatil3

-1

对于Mysql8->

查询:

SELECT properties, properties->"$.price" FROM book where isbn='978-9730228236' and  JSON_EXTRACT(properties, "$.price") > 400;

数据:

mysql> select * from book\G;
*************************** 1. row ***************************
id: 1
isbn: 978-9730228236
properties: {"price": 44.99, "title": "High-Performance Java Persistence", "author": "Vlad Mihalcea", "publisher": "Amazon"}
1 row in set (0.00 sec)

-2

我认为...

搜索部分值:

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])*key_word([^"])*"';

搜索准确的词:

SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_word[[:>:]]"';

1
这与已经存在的答案之一完全相同。无需重复Valentino所说的话:)
MBorg

-7

适用于MySQL全部(和5.7)

SELECT LOWER(TRIM(BOTH 0x22 FROM TRIM(BOTH 0x20 FROM SUBSTRING(SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed)))),LOCATE(0x22,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed))))),LENGTH(json_filed))))) AS result FROM `table`;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.