我无法弄清楚下划线字符在SQLite like
语句中的作用。
通配符%
可能与大多数其他SQL数据库中的相同。
那么该死的_
角色做了什么?
答案 0 :(得分:81)
LIKE
表达式中的标准SQL:
%
匹配任何字符序列,包括空字符。它相当于正则表达式中的.*
。_
匹配单个字符。它相当于正则表达式中的.
。您可以选择一个字符来转义%
,_
及其本身:
... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\'
这将匹配a×b×××c\d%_
或a×bc\d%_
但不匹配abc\d%_
或a×b×××cd%_
。
除了GLOB
变为%
且*
变为_
之外,您还拥有?
关键字的行为方式完全相同。
答案 1 :(得分:61)
下划线也与大多数其他SQL数据库中的相同,并匹配任何单个字符(即它与正则表达式中的.
相同)。来自fine manual:
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使用zero and one for booleans。
答案 2 :(得分:8)
@Benoit答案的附录:
ESCAPE
适用于最新的LIKE
表达式,而非所有LIKE
表达式。要逃避所有问题,您必须多次使用ESCAPE
,例如下面的内容。
WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'
此谓词与foo
的值匹配,其中 bar%或 baz 加上任何字符。
答案 3 :(得分:0)
为了记录,我在XCode / Objective-C环境中使用,' \'不起作用。使用其他任何东西......
不支持使用反斜杠字符的C样式转义,因为它们不是标准SQL(https://www.sqlite.org/lang_expr.html)