SQLite как % и


Я не могу понять, что символ подчеркивания делает в SQLite like заявление. Подстановочный знак, %, вероятно, то же самое, что и в большинстве других баз данных SQL.

Так что же это за чертовщина _ символы?

4 52

4 ответа:

подчеркивание также совпадает с большинством других баз данных SQL и соответствует любому одиночному символу (т. е. это то же самое, что и . в регулярном выражении). Из тонкой ручной:

подчеркивание ( " _ " ) в подобном шаблоне соответствует любому одиночному символу в строке.

например:

-- The '_' matches the single 'c'
sqlite> select 'pancakes' like 'pan_akes';
1
-- This would need '__' to match the 'ca', only one '_' fails.
sqlite> select 'pancakes' like 'pan_kes';
0
-- '___' also fails, one too many '_'.
sqlite> select 'pancakes' like 'pan___kes';
0

и просто чтобы убедиться, что результаты имеют смысл: SQLite использует ноль и один для булевых.

это стандартный SQL, что в LIKE выражения:

  • % соответствует любой последовательности символов, в том числе пустой. Это эквивалентно .* в регулярном выражении.
  • _ соответствует одному символу. Это эквивалентно . в регулярном выражении.
  • вы можете выбрать символ для побега %,_ а сама себе с:

    ... WHERE expr LIKE 'a_b%c\d\%\_' ESCAPE '\'
    

    это будет соответствовать a×b×××c\d%_ или a×bc\d%_ а не abc\d%_, ни a×b×××cd%_.

дополнительно с SQLite у вас есть GLOB ключевое слово, которое ведет себя точно так же, за исключением того, что % становится * и _ становится ?.

добавление к ответу @Benoit:

The ESCAPE применяется к самому последнему LIKE выражения, не все LIKE выражения. Чтобы избежать все, что вы должны использовать ESCAPE несколько раз, например, ниже.

WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'

этот предикат соответствует значениям foo содержащих бар% или баз плюс любого персонажа.

для записи, я использую в среде XCode/Objective-C, '\' не работает. Используйте что-нибудь другое вместо этого...

экранирование в стиле C с использованием символа обратной косой черты не поддерживается, поскольку они не являются стандартными SQL (https://www.sqlite.org/lang_expr.html)