我有一张像下面这样的表格
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
但这会返回所有行。你能帮我修复我的查询以获得所需的输出吗?
答案 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