SQL中“不喜欢”运算符的替代方法

时间:2019-05-28 08:03:37

标签: sql sql-server

我要排除表1中以“ _test”结尾的用户帐户。 我用

select * from table1 Not Like '%_test'.

但是此查询无法正常工作。

2 个答案:

答案 0 :(得分:5)

LIKENOT LIKE没什么问题。 %_wildcards。您要求排除以test结尾的行,并且在此行之前至少包含一个字符,任何字符。

如果要将通配符用作文字字符,请you need to escape it

select * from table1
where SomeField not like '%[_]test'

给出此表:

declare @table1 table (somefield varchar(100))

insert into @table1
values
('abc'),
('test'),
('atest'),
('ab_test'),
('_test')

以下查询:

SELECT * 
FROM @table1
WHERE someField NOT LIKE '%[_]test'

返回:

somefield
---------
abc
test
atest

原始查询将返回:

somefield
---------
abc
test

因为%_test将与atest匹配

更新

查询返回空字段或包含空格的字段,而无需进行任何修改。鉴于此:

declare @table1 table (ID int identity,somefield varchar(100))

insert into @table1
values
('abc'),
('test'),
('atest'),
('ab_test'),
('_test'),
(''),
(' '),
(null)

SELECT *
FROM @table1
WHERE someField not LIKE '%[_]test' 

结果是:

ID  somefield
1   abc
2   test
3   atest
6   
7    

NULL不仅是空白。在SQL中,NULL表示未知,与它的任何比较也会产生一个Unknown值。甚至NOT UNKNOWN也会产生UNKNOWN。这意味着LIKENOT LIKE都不能匹配NULL值。该查询将必须显式添加一个OR SomeField IS NULL子句以返回NULL

SELECT *
FROM @table1
WHERE someField not LIKE '%[_]test' 
    OR somefield is null

这将返回:

ID  somefield
1   abc
2   test
3   atest
6   
7    
8   NULL

答案 1 :(得分:0)

在您的查询中,没有WHERE关键字和您要检查“赞”条件的列名。

SELECT * FROM Table1 WHERE
[AccountColumn] NOT LIKE '%[_]test'