如何根据过滤条件选择行

时间:2021-05-28 20:26:39

标签: sql oracle

我有一张像下面这样的表格

acct_nbr    counter_1   Counter_2   counter_3
1234           1           1           1
2345           0           2           1
5678           1           0           1
9876           0           0           1
4567           1           0           0
2804           0           1           1
4321           2           1           1

我需要根据计数器生成输出。如果所有三个计数器都是 1 或计数器之一是 1 而其他计数器不大于 1,那么我需要结果集中的那些行。 预期输出:

acct_nbr    counter_1   Counter_2   counter_3
1234           1           1           1
5678           1           0           1
9876           0           0           1
4567           1           0           0
2804           0           1           1

我试过了

SELECT *
FROM TABLE
WHERE counter_1 = 1 OR Counter_2 = 1 OR counter_3 = 1

但这会返回所有行。你能帮我修复我的查询以获得所需的输出吗?

2 个答案:

答案 0 :(得分:1)

你想要:

SELECT *
FROM   table_name
WHERE  ( counter_1 = 1 OR counter_2 = 1 OR counter_3 = 1 )
AND    counter_1 <= 1
AND    counter_2 <= 1
AND    counter_3 <= 1

或(虽然是一个更简单的查询,但 Oracle 不会在列上使用索引,而是需要基于函数的索引):

SELECT *
FROM   table_name
WHERE  GREATEST( counter_1, counter_2, counter_3 ) = 1

对于样本数据:

CREATE TABLE table_name ( acct_nbr, counter_1, Counter_2, counter_3 ) AS
SELECT 1234, 1, 1, 1 FROM DUAL UNION ALL
SELECT 2345, 0, 2, 1 FROM DUAL UNION ALL
SELECT 5678, 1, 0, 1 FROM DUAL UNION ALL
SELECT 9876, 0, 0, 1 FROM DUAL UNION ALL
SELECT 4567, 1, 0, 0 FROM DUAL UNION ALL
SELECT 2804, 0, 1, 1 FROM DUAL UNION ALL
SELECT 4321, 2, 1, 1 FROM DUAL UNION ALL
SELECT 7654, 0, 0, 0 FROM DUAL;

输出:

<块引用>
<头>
ACCT_NBR COUNTER_1 COUNTER_2 COUNTER_3
1234 1 1 1
5678 1 0 1
9876 0 0 1
4567 1 0 0
2804 0 1 1

db<>fiddle here


<块引用>

如果三个计数器都为 0,我需要过滤我们的行。

假设这要求在所有 3 个值都为零时包含行,那么您可以使用(假设仅非负整数值):

SELECT *
FROM   table_name
WHERE  counter_1 IN ( 0, 1 )
AND    counter_2 IN ( 0, 1 )
AND    counter_3 IN ( 0, 1 )

SELECT *
FROM   table_name
WHERE  GREATEST( counter_1, counter_2, counter_3 ) <= 1

db<>fiddle here

答案 1 :(得分:0)

您的描述似乎是:

where greatest(counter_1, counter_2, counter_3) <= 1

或者:

WHERE counter_1 <= 1 AND Counter_2 <= 1 AND counter_3 <= 1

或者,根据您的评论——假设这些值都是非负的:

where greatest(counter_1, counter_2, counter_3) <= 1 and
      least(counter_1, counter_2, counter_3) > 0