Ich füge meine Daten in eine Datenbank mit ein json_encoded
. Jetzt möchte ich in "Feature" suchen, kann es aber nicht.
MySQL-Abfrage:
SELECT `id` , `attribs_json`
FROM `products`
WHERE `attribs_json` REGEXP '"1":{"value":[^"3"$]'
Diese Abfrage zeigt mir alle Zeilen mit dem Schlüssel "1" und Wert ist alles, was nicht Wert ist "3".
Meine Daten sind:
{"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":""
}}
mysql
json
mysql-json
reza
quelle
quelle
Antworten:
Wenn Sie eine MySQL-Version> = 5.7 haben , können Sie Folgendes versuchen:
SELECT JSON_EXTRACT(name, "$.id") AS name FROM table WHERE JSON_EXTRACT(name, "$.id") > 3
Ausgabe:
+-------------------------------+ | name | +-------------------------------+ | {"id": "4", "name": "Betty"} | +-------------------------------+
Weitere Informationen finden Sie im MySQL-Referenzhandbuch:
https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html
quelle
json_encode
Speichert Integerst als doppelt quoierte Werte (also -string
Typ). Wenn auf der Suche nach gleich,JSON_EXTRACT(name, "$.id") = "4"
muss anstelle vonJSON_EXTRACT(name, "$.id") = 4
SELECT name->"$.id" as name FROM table WHERE name->"$.id" > 3
Ich persönlich finde es einfacher, dem zu folgen.Wenn Sie MySQL verwenden, kann die neueste Version dazu beitragen, Ihre Anforderungen zu erfüllen.
select * from products where attribs_json->"$.feature.value[*]" in (1,3)
quelle
Das Speichern von JSON in einer Datenbank verletzt die erste normale Form.
Das Beste, was Sie tun können, ist, Features zu normalisieren und in einer anderen Tabelle zu speichern. Dann können Sie eine viel besser aussehende und leistungsfähigere Abfrage mit Joins verwenden. Ihr JSON ähnelt sogar der Tabelle.
MySQL 5.7 verfügt über eine integrierte JSON-Funktionalität:
http://mysqlserverteam.com/mysql-5-7-lab-release-json-functions-part-2-querying-json-data/
Das richtige Muster ist:
[^}]
wird mit jedem Zeichen außer übereinstimmen}
quelle
Ich benutze diese Abfrage
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[[:>:]]"';
Die erste Abfrage verwende ich, um Teilwerte zu suchen. Die zweite Abfrage verwende ich, um das genaue Wort zu suchen.
quelle
{"images":"-"}
undSELECT id FROM parsed_redfin WHERE
Daten "RLIKE" "Bilder": "[[: <:]] - [[:>:]]"; `gibt nichts zurückIch denke...
Teilwert suchen:
SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])*key_word([^"])*"';
Suche genaues Wort:
SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_word[[:>:]]"';
quelle
für MySQL alle (und 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`;
quelle