我在数据库中有两个表。 Contacts
和Filter
在Contacts
,我有ID
,Name
和Email
作为领域。
在Filter
,我有ID
和code
我的目标是能够查询整个表并导出已按Filter表中的项筛选的列表。 (基本上与使用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%'
事情开始失败。
在我开始将嵌套的选择代码集成到过滤器中之前,我无法获得多个where字段不像X或field1不像Y工作。
任何输入都非常感谢。
样本数据
name email
bob [email protected]
joey [email protected]
期望的输出
[email protected]
更新:谢谢大家的帮助。对问题的第一阶段的回答是从OR变为AND。 :)
第二阶段:而不是拥有越来越大的查询,我宁愿使用查询确定要排除的项目(意味着如果它们中的任何一个匹配,那么将它们排除)..所以我会添加yahoo gmail protonmail到过滤器表的代码字段中的记录..就是这样
select distinct email from contacts where email not like in (select code from filters)
这失败了,因为它说select有多个记录
更新:
SELECT DISTINCT email FROM Contacts WHERE email NOT LIKE (select filters.code from filters where filters.id=4)
工作..但只是拉一个记录作为过滤器。并非所有这些都是过滤器。
您可以从下面的CHARINDEX
中受益,我认为这会提高查询的性能。此外,你可以使用group by
而不是distinct
,它也将有助于性能。
select email
from contacts
where charindex('gmail',email) < 1
and charindex('yahoo',email) < 1
group by email
您只需要使用AND而不是OR。
SELECT distinct email
FROM
contacts
WHERE
email not like '%gmail%'
AND email not like '%yahoo%'
两个问题
您需要每个条件的列名称,因此在OR之后添加电子邮件
select distinct email from contacts where email not like '%gmail%' or email not like '%yahoo%'
也许你想要在同一时间检查机器人,所以你需要AND
select distinct email from contacts where email not like '%gmail%' AND email not like '%yahoo%'
正如其他人所说,使用NOT LIKE
的正确布尔连接器是AND
,而不是OR
。
你可能会看到使用NOT
的逻辑:
select distinct email
from contacts
where not (email like '%gmail%' or email like '%yahoo%');
如果您的选择有两个NOT ORKE标准通过OR条件连接,那么一切都符合标准。在这种情况下,“gmail”不像“yahoo”,“yahoo”不像“gmail”,所以即使是那两个也会通过标准。通过将select转换为使用AND条件,您可以捕获这些情况。语法要求您在两个条件中提供字段名称。我觉得这段代码易于阅读并满足您的需求。
SELECT distinct email
FROM contacts
WHERE email not like '%gmail%'
AND email not like '%yahoo%'