2013-03-21 20 views
7

Die Datenbank, die ich mit Geschäften JSON Einträge in LONGDatenTypen arbeiten. Ich möchte Einträge abhängig von den JSON-Daten auswählen können. Hier einige Beispieldaten:MySQL REGEXP + Leerzeichen ( s)

{ 
    "12f9cb0a-2218-4590-a05d-c1ffab00f693": { 
     "0": { 
      "value": "test" 
     } 
    }, 
    "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { 
     "item": { 
      "0": "11" 
     } 
    } 
} 

Deshalb möchte ich Daten auszuwählen, die "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9" enthält: { "item": { "0": "11"}} durch heraus~~POS=TRUNC der Leerzeichen (Tabulatoren, Leerzeichen, Zeilenumbrüche) die REGEXP-Funktion habe ich dies ohne Erfolg versucht:

SELECT * FROM my_table WHERE (elements REGEXP BINARY '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\s*{\s*"item":\s*{\s*"0":\s*"11"\s*}\s*}'); 

die Regex Test funktioniert mit Rubular und Regexpal.com aber MYSQL scheint nicht zu mögen die \ s * Ausdruck. Hat jemand eine bessere Lösung dafür?

Antwort

22

Es scheint, dass MySQL nicht die \s Notation in regulären Ausdrücke nicht unterstützt, nur die [[:space:]] Notation (wobei [:space:], innerhalb einer Zeichenklasse, bedeutet „jeden Leerzeichen“).

Nebenbei bemerkt, wenn Sie tun benötigen einen Backslash — zum Beispiel, wenn Sie ein Sternchen und benötigen \* — Sie tatsächlich den umgekehrten Schrägstrich verdoppeln müssen (zB \\*), wie erwähnt in §12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual:

Hinweis
Da MySQL die C-Escape-Syntax in Strings verwendet (z. B. "\n", um das Newline-Zeichen darzustellen), müssen Sie "\", die Sie verwenden, verdoppeln in Ihren REGEXP Saiten.

+0

Dank. Gibt es eine C-Escape-Sequenz, die Tabulatoren, Leerzeichen UND neue Zeilen behandelt? (eine Alternative zu \ s) –

+0

Re-lesen, dass die Abfrage immer noch nichts zurückgibt :(. Es bricht von '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": \\ s *' ... '"4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9 ": \\ s * {'funktioniert nicht –

+0

Immer noch kein Glück! Ich habe versucht ** \ {** und ** \\ {** –

0

Verwenden String ersetzen;

select replace(json, ' ','') from table; 

Wenn Ihre Daten Leerzeichen enthält, wird dies nicht funktionieren.

+0

nach Abfrage hinzugefügt, ruakh Beiträge eine ausgezeichnete Antwort. lies seins. – Lighthart

0

Es ist besser json Typ zu verwenden: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"