在oracle中交替使用多个AND条件

时间:2015-09-04 12:12:09

标签: oracle

我知道IN可以替代多个OR:

select loginid from customer where code IN ('TEST1','TEST2','TEST3','TEST4'))

这将返回所有具有四个TEST元素中的任何一个的代码的loginid。 AND有类似的东西吗?我需要找出所有具有代码的登录名:TEST10,TESTA,TEST1,TESTB,AIFK,AICK ....(有20个代码)

3 个答案:

答案 0 :(得分:3)

你无法比较。使用OR或IN,您可以查找与一个值相匹配的记录。使用AND,您可以查找列匹配所有这些值的记录,但此字段当然只能包含一个值,因此永远不会找到任何记录。

显然,你正在寻找其他东西。您可能希望聚合数据,以查找存在每个值的记录的ID。这将是:

select loginid 
from customer 
where code IN ('TEST1','TEST2','TEST3','TEST4')
group by loginid
having count(distinct code) = 4;

答案 1 :(得分:2)

简短的回答,我知道,但有时这是唯一真正的答案。

然而

根据您要实现的目标,您可以使用对项目进行分组的计数,以检查所有匹配项。

这假设您的CustomerCodes保存在单独的关系表中。

SELECT loginID
FROM Customer
WHERE loginID IN (
    SELECT loginID, count(*) as codeCount
    FROM CustomerCodes
    GROUP BY loginID
    HAVING codeCount = 20
)

如果您有Code1,Code2 Code3等字段,则无效...您必须将数据拆分为单独的表格,例如:

loginID | code
---------------
1       | code1
1       | code2

答案 2 :(得分:2)

您可以执行以下操作:

SELECT loginid
  FROM customer
 WHERE code IN ('TEST1', ... , 'TEST20')
 GROUP BY loginid
HAVING COUNT(DISTINCT code) = 20;

Jon的回答和这个问题的区别在于,如果你在表格中使用其他代码,我的查询将返回所有这些20个代码都有行的登录名,而Jon的回答将是返回有20个不同代码的所有loginids。