Альтернатива оператору Not Like в SQL

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

select * from table1 Not Like '%_test'.

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

Я думаю, он даже не компилируется? Пожалуйста, будьте ясны и конкретны - никогда говорит «не работает», что может означать тысячу вещей и, следовательно, ничего не значит.

Peter B 28.05.2019 10:06

Похоже, вы пропустили WHERE из своего фрагмента кода, также можете опубликовать сообщение об ошибке

Tom Halson 28.05.2019 10:06
_ — это подстановочный знак НРАВИТСЯ.
jarlh 28.05.2019 10:07

Помимо отсутствующего WHERE, что вызовет синтаксическую ошибку, что в запросе не работает должным образом?

Larnu 28.05.2019 10:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
2 135
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет ничего плохого в ПОДОБНО и 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

Запрос оригинальный вернет:

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. Это означает, что ни 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

Большое спасибо, но в некоторых случаях someField пуст, я хочу включить их также, потому что в этой строке доступны другие поля, кроме someField, в настоящее время он показывает, только если есть данные, и удаляет те, которые пусты

JP. 29.05.2019 09:02

@JP. что означает blank? Пустая строка, пробел или NULL? Это не одно и то же. Запрос вернет пустые поля и поля с пробелами. Сравнение что-нибудь с NULL возвращает NULL, что означает, что сравнение не выполняется независимо от того, используете ли вы NOT или нет. Вам нужно будет добавить OR someField is NULL, чтобы покрыть NULL. Обновите вопрос и опубликуйте то, что хотите, включая образцы данных и желаемый результат.

Panagiotis Kanavos 29.05.2019 09:08

Мы объединяем 2 таблицы: в таблице 1 столбец имени пользователя пуст, а в таблице 2, когда мы добавляем условие someField NOT LIKE '% [_] test', он также удаляет пустые столбцы, я хочу включить, даже если они пусты .

JP. 29.05.2019 09:28

@JP. Придется снова писать тот же комментарий. blank ничего не значит. Выложите данные и результаты. Используйте OR IS NULL, чтобы включить нули. Запрос уже возвращает пробелы или пустые строки.

Panagiotis Kanavos 29.05.2019 09:31

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

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

Другие вопросы по теме