2013-03-21 3 views
7

База данных, в которой я работаю с магазинами записей JSON в типах данных LONGTEXT. Я хочу иметь возможность выбирать записи в зависимости от данных JSON. Вот некоторые примеры данных:MySQL REGEXP + whitespace ( s)

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

Поэтому я хочу, чтобы выбрать данные, содержащие "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": { "пункт": { "0": "11"}} по отфильтровывая пропуски (вкладки, пробелы, новые строки) с помощью функции REGEXP, я попытался это не дало никаких результатов:

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

испытание регулярное выражение работает с использованием Rubular и Regexpal.com но MYSQL, кажется, не нравится выражение \ s *. У кого-нибудь есть лучшее решение для этого?

ответ

22

Похоже, что MySQL не поддерживает \s обозначений в регулярных выражениях, только [[:space:]] обозначения (причем [:space:], внутри класса символов, означают «любой символ пробела»).

Кстати, когда вы сделать нужен обратный слэш —, например, когда требуется буквального звездочку \* — вам действительно нужно удвоить обратную косую черту (например, \\*), как отмечено в §12.5.2 "Regular Expressions" of the MySQL 5.6 Reference Manual:

Примечание
Поскольку MySQL использует синтаксис C escape в строках (например, «\n» для представления символа новой строки), вы должны удвоить любой «\», который вы используете в ваших строках REGEXP.

+0

Спасибо. Есть ли escape-последовательность C, которая обрабатывает вкладки, пробелы и новые строки? (альтернатива \ s) –

+0

Повторно прочитайте, что запрос все равно ничего не возвращает :(Он разбивается с '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": \\ s *' ... '"4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9 ": \\ s * {'не работает –

+0

По-прежнему не повезло! Я пробовал ** \ {** и ** \\ {** –

0

Использовать замену строки;

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

Если в ваших данных есть пробелы, это не сработает.

+0

после того, как вы добавили запрос, ruah отправляет отличный ответ. прочитайте его. – Lighthart

0

Лучше использовать JSon тип: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"