2013-03-21 17 views
7

Baza danych, z którą pracuję, przechowuje wpisy JSON w typach LONGTEXT. Chcę mieć możliwość wybierania wpisów w zależności od danych JSON. Oto kilka przykładów danych:MySQL REGEXP + biała spacja ( s)

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

Więc chcę zaznaczyć dane, które zawiera "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { "poz": { "0": "11"}} przez odfiltrowanie białe znaki (spacje, tabulatory, nowych linii) Korzystanie z funkcji regexp, próbowałem to bezskutecznie:

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

Test regex działa używając Rubular i Regexpal.com ale MySQL nie wydają się podoba wyrażenie o wartości \. Czy ktoś ma lepsze rozwiązanie?

Odpowiedz

22

Wydaje się, że MySQL nie obsługuje notacji \s w regexes, tylko notacja [[:space:]] (przy czym [:space:] wewnątrz klasy znaków, oznacza „dowolny biały znak”).

Nawiasem mówiąc, kiedy zrobić potrzebują backslash — na przykład, gdy trzeba dosłownego gwiazdkę \* — rzeczywiście trzeba podwoić odwrotny ukośnik (np \\*), jak zauważono w §12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual:

Uwaga: Ponieważ MySQL używa składni Escape C w łańcuchach znaków (na przykład "\n" do reprezentowania znaku nowego wiersza), należy podwoić dowolne "\", którego używasz w twoich ciągach REGEXP.

+0

Dzięki. Czy istnieje sekwencja specjalna C obsługująca tabulatory, spacje I nowe linie? (alternatywa dla \ s) –

+0

Powtórz to, zapytanie wciąż nie zwraca nic :(Przerywa od '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": \\ s *' ... '"4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9 ": \\ s * {'nie działa –

+0

Wciąż nie ma szczęścia! Próbowałem ** \ {** i ** \\ {** –

0

Użyj ciągu zastępującego;

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

Jeśli Twoje dane zawierają spacje, to nie zadziała.

+0

po dodaniu zapytania, ruakh wysyła doskonałą odpowiedź. przeczytaj jego. – Lighthart

0

Lepiej jest użyć typu json: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"