2013-03-21 23 views
7

Il database con cui lavoro memorizza le voci JSON nei tipi di dati LONGTEXT. Voglio poter selezionare le voci in base ai dati JSON. Ecco alcuni dati esempio:MySQL REGEXP + spazio bianco ( s)

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

Quindi voglio selezionare i dati che contiene "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { "voce": { "0": "11"}} da filtrando gli spazi (tabulazioni, spazi, nuove linee) utilizzando la funzione REGEXP, ho provato questo senza alcun risultato:

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

il test funziona utilizzando regex Rubular e Regexpal.com ma MySQL non sembrano come l'espressione \ s *. Qualcuno ha una soluzione migliore per questo?

risposta

22

Sembra che MySQL non supporta la notazione \s in regex, solo il [[:space:]] notazione (quale [:space:], una classe di caratteri, significa "qualsiasi carattere vuoto").

Per inciso, quando si fai bisogno di una barra rovesciata — ad esempio, quando è necessario un asterisco letterale \* — hai veramente bisogno di raddoppiare la barra rovesciata (ad esempio \\*), come indicato nella §12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual:

Nota
Poiché MySQL utilizza la sintassi C escape nelle stringhe (ad esempio "\n" per rappresentare il carattere di nuova riga), è necessario raddoppiare qualsiasi "\" utilizzato nelle tue stringhe REGEXP.

+0

Grazie. Esiste una sequenza di escape C che gestisce schede, spazi E nuove linee? (un'alternativa a \ s) –

+0

Rileggi che, la query non restituisce ancora nulla :(. Si interrompe da "" 4d1dfd2e-7bc1-4303-9c8c-90856e918bb9 ": \\ s * '...'" 4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9 ": \\ s * {'non funziona –

+0

Ancora senza fortuna! Ho provato ** \ {** e ** \\ {** –

0

Utilizzare stringa sostituire;

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

Se i dati contiene spazi, questo non funzionerà.

+0

dopo aver aggiunto la query, ruakh invia una risposta eccellente. leggi il suo. – Lighthart

0

E 'meglio usare JSON Tipo: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"