Я не могу понять, что делает символ подчеркивания в инструкции SQLite like
.
Символ подстановки, %
, вероятно, такой же, как в большинстве других баз данных SQL.
Итак, что делает черт _
символ?
Подчеркивание также такое же, как и в большинстве других баз данных 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.
Это стандартный 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:
ESCAPE
применяется к последнему выражению LIKE
, а не ко всем выражениям LIKE
. Чтобы избежать всех, вы должны использовать ESCAPE
несколько раз, например, ниже.
WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'
Этот предикат соответствует значениям foo
, которые содержат bar%, или baz плюс любой символ.
Для записи я использую в среде XCode/ Objective-C, '\' не работает. Вместо этого используйте что-нибудь еще...
Сценарии стиля C, использующие символ обратной косой черты, не поддерживаются, потому что они не являются стандартными SQL (https://www.sqlite.org/lang_expr.html)
select 'pancakes' like 'pan__kes'
.