有一个需求,需要查询SQL Server里一个表中某个字符串类型的字段中包含下划线的记录。很自然会想到这样的代码:

1
SELECT * FROM MyTable WHERE MyCol LIKE '%_%'

结果证明这种写法是错误的。原谅我SQL编程的功力已经极大的退化了。原来下划线 _LIKE 子句中代表“一个”任意字符,而我需要将它作为普通字符查询,怎么做呢?有2种方法:

中括号

万能的中括号 ([]) 可以做到:

1
SELECT * FROM MyTable WHERE MyCol LIKE '%[_]%'

ESCAPE 语句

可以用 ESCAPE 语句指定一个转义字符,然后 LIKE 语句中这个转义符后面的一个字符将作为普通字符处理:

1
2
3
4
SELECT * FROM MyTable WHERE MyCol LIKE '%\_%' ESCAPE '\'
-- or
SELECT * FROM MyTable WHERE MyCol LIKE '%^_%' ESCAPE '^'
-- 可以试试其它字符当转义符,效果都一样

完整的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE Test
(
Col VARCHAR(100)
)

INSERT INTO Test
VALUES
('A'),
('B'),
('A_B'),
('X_Y_Z'),
('123')

SELECT *
FROM Test
WHERE Col LIKE '1_3'

SELECT *
FROM Test
WHERE Col LIKE '%[_]%'

SELECT *
FROM Test
WHERE Col LIKE '%\_%' ESCAPE '\'

DROP TABLE Test

留言

2017-06-16