我在数据库中有两个表。 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或不像Y那样工作的field的倍数。
非常感谢任何输入。
样本数据
name email
bob bob@gmail.com
joey joey@cisco.com
所需的输出
joey@cisco.com
更新:谢谢大家的帮助。问题第一阶段的答案是从OR更改为AND。 :)
第二阶段:我宁愿使用查询来确定要排除的项目(这意味着如果其中任何一个匹配,然后将其排除在外)。因此,我将添加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)
可以工作..但仅提取一条记录作为过滤器。并非全部作为过滤器。
答案 0 :(得分:1)
您只需要使用AND而不是OR。
SELECT distinct email
FROM
contacts
WHERE
email not like '%gmail%'
AND email not like '%yahoo%'
答案 1 :(得分:1)
您可以从CHARINDEX
中受益,如下所示,我认为这将提高查询的性能。另外,您可以使用group by
代替distinct
,这也将有助于提高性能。
select email
from contacts
where charindex('gmail',email) < 1
and charindex('yahoo',email) < 1
group by email
答案 2 :(得分:0)
两个问题
您需要每种条件的列名,因此请在OR后面添加电子邮件
select distinct email from contacts where email not like '%gmail%' or email not like '%yahoo%'
并且可能是您想同时检查bot,因此您需要AND
select distinct email from contacts where email not like '%gmail%' AND email not like '%yahoo%'
答案 3 :(得分:0)
正如其他人指出的那样,带有NOT LIKE
的正确布尔连接器是AND
,而不是OR
。
您可能会看到使用NOT
的逻辑:
select distinct email
from contacts
where not (email like '%gmail%' or email like '%yahoo%');
答案 4 :(得分:-1)
如果您的选择具有通过OR条件连接的两个NOT LIKE条件,则所有条件都将满足条件。在这种情况下,“ gmail”不像“ yahoo”,“ yahoo”也不像“ gmail”,因此即使这两个都可以通过标准。通过将选择转换为使用AND条件,您可以捕获这些情况。该语法要求您在两种情况下都提供字段名称。我觉得这段代码易于阅读,可以满足您的需求。
SELECT distinct email
FROM contacts
WHERE email not like '%gmail%'
AND email not like '%yahoo%'