Как иметь несколько НЕ НРАВИТСЯ в SQL - PullRequest
0 голосов
/ 04 марта 2019

У меня есть две таблицы в базе данных.Contacts и Filter

В Contacts у меня есть ID, Name и Email в качестве полей.

в Filter, у меня есть ID и code

Моя цель - иметь возможность запрашивать всю таблицу и экспортировать список, который был отфильтрован по элементам в таблице фильтра.(в основном то же самое, что может быть достигнуто с помощью grep -i -Ev) ... В основном я хочу отфильтровать gmail, Yahoo или другие).

Так что, если я сделаю

select distinct email from contacts where email not like '%gmail%'

Один уровень фильтра работает.но если я это сделаю,

select distinct email from contacts where email not like '%gmail%' or not like '%yahoo%'

, тогда все пойдет не так.

Прежде чем я начну интегрировать вложенный код выбора в фильтр, я не могу получить поле множественного числа, где не похоже на X, или поле field1, не похожее на Y, работает.

Любые входные данные приветствуются.

выборка данных

name           email 
bob            bob@gmail.com
joey           joey@cisco.com

желаемый вывод

joey@cisco.com

ОБНОВЛЕНИЕ: Спасибо всем за помощь.Ответом на первый этап вопроса было изменение с ИЛИ на И.:)

Этап II: вместо того, чтобы иметь запрос, который становится все больше и больше, я бы предпочел использовать запрос для определения исключаемых элементов (то есть, если какой-либо из них совпадает, то исключить их) .. такЗатем я добавил бы yahoo gmail protonmail к записям в поле кода таблицы фильтров ... при этом это будет

select distinct email from contacts where email not like in (select code from filters)

Это не удастся, так как он говорит, что выбор имеет несколько записей

ОБНОВЛЕНИЕ:

SELECT DISTINCT email FROM Contacts WHERE email NOT LIKE (select filters.code from filters where filters.id=4)

работает .. но использует только одну запись в качестве фильтра.не все из них как фильтры.

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

Как уже отмечали другие, правильный логический соединитель с NOT LIKE имеет значение AND, а не OR.

Логика может отображаться с использованием NOT:

select distinct email
from contacts
where not (email like '%gmail%' or email like '%yahoo%');
0 голосов
/ 04 марта 2019

Вы можете воспользоваться CHARINDEX, как показано ниже, я думаю, что это повысит производительность вашего запроса.Также вы можете использовать group by вместо distinct, это также поможет производительности.

select email 
from contacts 
where charindex('gmail',email) < 1 
  and charindex('yahoo',email) < 1
group by email
0 голосов
/ 04 марта 2019

Если ваш выбор имеет два критерия NOT LIKE, связанных условием ИЛИ, тогда все будет соответствовать критериям.В этой ситуации "gmail" не похож на "Yahoo", а "Yahoo" не похож на "Gmail", поэтому даже эти два будут соответствовать критериям.Преобразовав выбор для использования условия AND вместо этого, вы фиксируете эти ситуации.Синтаксис требует, чтобы вы указали имя поля в обоих условиях.Мне кажется, что этот код легко читается и соответствует вашим потребностям.

SELECT distinct email 
FROM contacts 
WHERE email not like '%gmail%' 
   AND email not like '%yahoo%'
0 голосов
/ 04 марта 2019

Два выпуска

вам нужно имя столбца для каждого условия, поэтому добавьте адрес электронной почты после ИЛИ

 select distinct email from contacts where email not like '%gmail%' or email not like '%yahoo%'

и, возможно, вы захотите проверить бота в одно и то же время, поэтому вам нужно И

 select distinct email from contacts where email not like '%gmail%' AND email not like '%yahoo%'
0 голосов
/ 04 марта 2019

Вам просто нужно использовать AND вместо OR.

SELECT distinct email 
FROM 
    contacts 
WHERE 
    email not like '%gmail%' 
    AND email not like '%yahoo%'
...