SQLite Like% и _ - PullRequest
       4

SQLite Like% и _

55 голосов
/ 06 сентября 2011

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

Итак, что делает этот чертов _ персонаж?

Ответы [ 4 ]

82 голосов
/ 06 сентября 2011

Стандартный SQL в выражениях LIKE:

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

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

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

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

61 голосов
/ 06 сентября 2011

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

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

Например:

-- 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 использует ноль и один для логических значений .

8 голосов
/ 27 октября 2015

Приложение к ответу @ Бенуа:

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

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

Этот предикат соответствует значениям foo, которые содержат bar% или baz плюс любой символ.

0 голосов
/ 07 апреля 2015

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

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

...