如何在MySQL中搜索JSON数据?

rez*_*eza 54 mysql json mysql-json

我正在将数据插入数据库中json_encoded.现在我想搜索"功能",但我不能.

MySQL查询:

SELECT  `id` ,  `attribs_json` 
FROM  `products` 
WHERE  `attribs_json` REGEXP  '"1":{"value":[^"3"$]'
Run Code Online (Sandbox Code Playgroud)

这个查询显示了所有带有键"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":""
}}
Run Code Online (Sandbox Code Playgroud)

Zee*_*oft 93

如果你有MySQL版本> = 5.7,那么你可以试试这个:

SELECT JSON_EXTRACT(name, "$.id") AS name
FROM table
WHERE JSON_EXTRACT(name, "$.id") > 3
Run Code Online (Sandbox Code Playgroud)

输出:

+-------------------------------+
| name                          | 
+-------------------------------+
| {"id": "4", "name": "Betty"}  | 
+-------------------------------+
Run Code Online (Sandbox Code Playgroud)


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

  • > 在 MySQL 5.7.9 及更高版本中,当与两个参数一起使用时,-> 运算符充当 JSON_EXTRACT() 函数的别名。您的示例将变为: `SELECT name->"$.id" as name FROM table WHERE name- >"$.id" > 3` 就我个人而言,我发现这更容易理解。 (12认同)
  • 重要提示:`json_encode` 将整数保存为双引号值(因此 - `string` 类型)。如果搜索相等,则必须使用 `JSON_EXTRACT(name, "$.id") = "4"` 而不是 `JSON_EXTRACT(name, "$.id") = 4` (2认同)

Ban*_*dre 14

如果 MySQL 版本 < 5.7

SELECT fields
FROM table
WHERE field_json LIKE '%"key":"70"%';
Run Code Online (Sandbox Code Playgroud)

// 70 = 值


Vis*_*h G 13

如果您使用MySQL最新版本可能有助于达到您的要求.

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

  • 最新的mysql版本是什么意思?支持什么版本? (5认同)
  • MySQL 5.5 及以上@Sérgio (2认同)

Nak*_*lda 12

  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"[^}]*}'
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 同意上面的#1,但有时您会遇到在设计时表上很少有字段名称未知的情况。在这种情况下,您可以通过在表上使用 JSON 数据类型来混合关系和 nosql 数据存储。 (4认同)
  • 对于第 1 点,问题不在于模式设计,而在于将数据存储提取为 json。第 2 点是答案的链接,第 3 点很脆弱,因为如果 json 发生更改,它可能会失败。 (2认同)

小智 10

对于Mysql8->

询问:

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

数据:

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)
Run Code Online (Sandbox Code Playgroud)


小智 9

我用这个查询

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[[:>:]]"';
Run Code Online (Sandbox Code Playgroud)

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


小智 8

请这样做。

SELECT * FROM `products` 
    WHERE JSON_UNQUOTE(JSON_EXTRACT(`attribs_json`, '$.value')) LIKE '%X%'
Run Code Online (Sandbox Code Playgroud)


小智 6

SELECT
    country.NAME AS 'country_name',
    city.NAME AS 'city_name',
    city.district,
    city.info,
    JSON_EXTRACT( city.info, "$.Population" ) AS 'formated_population' 
FROM
    city
    INNER JOIN country ON city.CountryCode = country.
    CODE INNER JOIN countrylanguage ON country.CODE = countrylanguage.CountryCode 
GROUP BY
    city.NAME,
    city.district,
    country.NAME;

ORDER BY
    country.NAME ASC;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述