SQLite Like% и _

44

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

Итак, что делает черт _ символ?

Теги:
sql-like

4 ответа

56
Лучший ответ

Подчеркивание также такое же, как и в большинстве других баз данных 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 использует ноль и один для booleans.

  • 1
    Спасибо, мю. [дополнительные символы]
  • 0
    Примечание: select 'pancakes' like 'pan__kes' .
76

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

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

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

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

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

  • 0
    Спасибо, Бенуа. Я выбрал другой ответ, судя только по времени.
  • 0
    Это спасло мне жизнь. Я искал, как избежать "%" в запросах SQLite. Но я должен был дать '\\', чтобы он работал, а не просто '\' (я работал над Javscript + WebSQL). Ниже запрос работал для меня. SELECT * FROM предложений, ГДЕ заголовок LIKE '% 50 \\ %%' ESCAPE '\\' (это вернет все предложения с заголовком, имеющим 50%)
Показать ещё 2 комментария
6

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

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню