it-swarm.com.ru

Как искать данные JSON в MySQL?

Я вставляю свои данные в базу данных с помощью 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":""
}}
33
reza

Если у вас MySQL version> = 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/ru/json-search-functions.html

51
Sachin Vairagi
  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"[^}]*}'
    

    [^}] будет соответствовать любому символу, кроме }

11
Naktibalda

Если вы используете MySQL, последняя версия может помочь в достижении ваших требований.

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

Я использую этот запрос

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[[:>:]]"';

Первый запрос я использую для поиска частичного значения. Второй запрос, который я использую, чтобы найти точное слово.

5
Valentino

для 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`;
0
0x00