MySQL REGEXP + пробелы (s)

база данных, с которой я работаю, хранит записи JSON в типах данных LONGTEXT. Я хочу иметь возможность выбирать записи в зависимости от данных JSON. Вот некоторые примеры данных:

 {
    "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*}');

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

3 ответов


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

кстати, когда вы do нужна обратная косая черта - например, когда вам нужна буквальная звездочка \* - вам действительно нужно удвоить обратную косую черту (например,\*), как указано в §12.5.2 "регулярные выражения" из MySQL 5.6 Ссылка Руководство:

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


использовать строку replace;

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

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


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