Нет ничего плохого в LIKE и NOT LIKE
. %
и _
являются подстановочными знаками . Вы просили исключить строки, заканчивающиеся test
и хотя бы одним символом до этого, любым символом.
Если вы хотите использовать подстановочный знак в качестве литерального символа, вам нужно экранировать его :
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
Запрос original вернет:
somefield
---------
abc
test
Потому что %_test
будет соответствовать atest
UPDATE
Запрос возвращает пустые поля или поля, содержащие пробелы, без каких-либо изменений. Учитывая это:
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, и любое сравнение с ним также приводит к значению Unknown
. Даже NOT UNKNOWN
приводит к UNKNOWN
. Это означает, что ни LIKE
, ни NOT 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