like谓语
sql的like
谓语可以使用模式去匹配特定的字符,用于过滤数据,语法形式如下:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
- match_expression是任意合法的表达式,如字段名称等。
- pattern是用于搜索字符串的匹配模式,可以包含合法的通配符,一般数据库都支持的通配符有
%
和_
,其中%
匹配0个或者多个字符,_
匹配一个字符。此外sql server数据库的like
谓语还可以使用通配符[]
和[^]
,但是oracle和mysql的like
谓语却不支持,oracle可以使用REGEXP_LIKE
。 - escape_character是指定的转义字符,如sql
select * from Product where name like \'\\%C%\' escape \'\\\'
指定了\\
作为转义字符,\\
之后的一个字符就是普通的字符,不再作为通配符进行匹配,那么这个匹配搜索的字符串就是以%C
开头的字符串。
注意
在实际使用like
谓语时需要注意通配符需要转义的问题,不管是从存储时进行转义还是查询时转义,否则就会出现实际查询结果和预期结果不一致的问题。
在sql server中如我们有如下的数据
我们通过前台查询,想要得到以 通知[2019] 开头的数据,如果我们通过select * from Product where name like \'%通知[2019]%\'
这样的sql去查询数据,那么得到的结果如下,和明显这不是我们想要的结果。
因为在sql server中[]
属于谓语like
的通配符,是需要进行转义的,将sql改写为select * from Product where name like \'%通知\\[2019\\]%\' escape \'\\\'
即可得到如下的正确结果。
参考
- https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
- https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
- Oracle® Database SQL Language Reference 11g Release 2 (11.2)