2011-09-23 3 views
1

Je suis un débutant dans regexp et j'essayer de chercher du texte au format JSON, mais je ne peux pas le faire fonctionner à droite:MYSQL REGEXP recherche dans la chaîne JSON

SELECT DISTINCT tag, body FROM pages 
WHERE (body REGEXP BINARY '"listeListeOuiNon":".*1.*"') 

Il me montre que le texte des résultats avec

"listeListeOuiNon":"1" et

"listeListeOuiNon":"1,2" et

"listeListeOuiNon":"0,1"as expected,

mais aussi "listeListeOuiNon":"2" (not expected)

Une idée? Peut-être parce que c'est gourmand, mais je ne suis pas sûr ...

Merci d'avance!

+0

Juste un mot d'avertissement, MySQL est un REGEX * très * opération coûteuse. Il est souvent plus rapide de casser ce que vous pouvez en plusieurs déclarations LIKE si vous pouvez le balancer. Aussi, est-ce une requête courante ou le texte correspondant changera-t-il souvent? – Nick

+0

oui je sais être comme plus rapide, mais en fait le texte correspondant change et l'essaye avec LIKE '' listeListeOuiNon ":"% 1% "'n'est pas mieux .. – mrflos

+0

Pouvez-vous nous donner un exemple de ligne où" listeListeOuiNon ": "2" a été apparié? – Nick

Répondre

1

I essayerait de remplacer les deux .* avec [^"]* ... Cela ne sera cependant suffisant que si votre listeListeOuiNon ne peut pas contenir " s, ou vous devez également gérer la séquence d'échappement. Fondamentalement avec le . vous correspondra à toute chaîne JSON qui a un 1 "après" "listListOuiNon":", même si c'est dans un autre domaine, et oui, c'est parce que c'est gourmand.

+0

waouw ! ça a l'air de marcher !! SELECT '"listeListeOuiNon": "2", "listeToto": "1"' REGEXP BINARY '"listeListeOuiNon": "[^"] * 1 [^ "] *"' est égal à 0! Merci beaucoup! – mrflos

+0

Pas de problème ...;) – Romain

2

Eh bien, il est assez facile de debug:

SELECT '"listeListeOuiNon":"2"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

retourne 0

SELECT '"listeListeOuiNon":"1"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

retours 1

SELECT '"listeListeOuiNon":"1,2"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

renvoie 1

Donc, quelque chose ne va pas à vos côtés ... car il ne peut tout simplement pas retourner les lignes où le corps est égal à "listeListeOuiNon":"2". Mais il est possible que le corps a plusieurs de ces déclarations, quelque chose comme:

body => ' "listeListeOuiNon": "1,2", "listeListeOuiNon": "2"'

donc vous devez modifier votre regexp:

'^"listeListeOuiNon":".*1.*"$'

Eh bien, alors vous devez modifier votre requête:

SELECT DISTINCT tag, body FROM pages WHERE (body REGEXP BINARY '"listeListeOuiNon":".*1.*"') AND NOT (body REGEXP BINARY '"listeListeOuiNon":"2"')

+0

merci Jauzsika, mais en fait j'ai des données compliquées, comme: {"bf_titre": "Veille partage", "listeListeLogiciel": "BAZ", "listeListeEtatDuBug": "CONF", "listeListeBugs": "USER", "listeListeOuiNon": "2", "bf_sauveur": "Florian "," id_typeannonce ":" 31 "," créateur ":" Anonyme "," categorie_fiche ":" Maintenance du site "," date_creation_fiche ":" 2011-08-30 14:20:09 "," date_debut_validite_fiche ":" 2011-08-30 "," date_fin_validite_fiche ":" 0000-00-00 "," statut_fiche ":" 1 "," id_fiche ":" VeillePartagee "} <- et pour cela cela ne fonctionne pas .. – mrflos

1

retourne 0.

enter image description here

+0

mon problème est que j'ai plus dans mon texte json ..: SELECT '"listeListeOuiNon": "2", "listeToto": "1"' REGEXP BINARY '"listeListeOuiNon": " .*1.*"' – mrflos