альтернатива для оператора Not Like в SQL - PullRequest
0 голосов
/ 28 мая 2019

Я хочу исключить учетные записи пользователей, которые заканчиваются на '_test' в таблице1.Я использую

select * from table1 Not Like '%_test'.

Но этот запрос не работает должным образом.

Ответы [ 2 ]

5 голосов
/ 28 мая 2019

Нет ничего плохого в 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
0 голосов
/ 28 мая 2019

В вашем запросе нет ключевого слова WHERE и имени столбца, для которого вы хотите проверить условие «like».

SELECT * FROM Table1 WHERE
[AccountColumn] NOT LIKE '%[_]test'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...