Sql Oracle条件为仅拉动';0';价值观

Sql Oracle条件为仅拉动';0';价值观,sql,oracle,Sql,Oracle,我需要为A列和B列提取只有0个值的ID。例如: +----+------+------+ | ID | A | B | +----+------+------+ | 1 | null | 123 | | 2 | 23 | 768 | | 3 | 0 | 0 | | 4 | 96 | 0 | | 5 | 0 | null | | 6 | 0 | 0 | +----+------+------+

我需要为A列和B列提取只有0个值的ID。例如:


+----+------+------+
| ID |   A  |   B  |  
+----+------+------+
|  1 | null | 123  |  
|  2 | 23   | 768  |  
|  3 | 0    | 0    |  
|  4 | 96   | 0    |  
|  5 | 0    | null | 
|  6 | 0    | 0    |  
+----+------+------+

我已经尝试了几个查询,但仍然在处理0以上的值。由于表中有空值,我使用NVL(expr1,0)语法将空值替换为0:

+----+------+------+
| ID |   A  |   B  |  
+----+------+------+
|  1 |  0   | 123  |  
|  2 | 23   | 768  |  
|  3 | 0    | 0    |  
|  4 | 96   | 0    |  
|  5 | 0    | 0    | 
|  6 | 0    | 0    |  
+----+------+------+
我在WHERE子句中使用了以下内容,并得到以下结果:


Where status = 'OPEN'
   AND a.value IS NULL OR a.value = '0'
   AND b.value IS NULL OR b.value = '0'

Output:

+----+----+-----+
| ID | A  |  B  |
+----+----+-----+
|  1 |  0 | 123 | 
|  3 |  0 |   0 |  
|  5 |  0 |   0 | 
|  6 |  0 |   0 | 
+----+----+-----+

似乎我只为A拉取了0个值,但B的值仍然大于0。我只需要为A和B拉取值均为0的ID。

我想您只需要括号:

Where status = 'OPEN' AND
      (a.value IS NULL OR a.value = 0) AND
      (b.value IS NULL OR b.value = 0)

我喜欢戈登的答案,但为了简洁起见,我会在这里使用
COALESCE

SELECT *
...
WHERE
    status = 'OPEN' AND
    COALESCE(a.value, 0) = 0 AND
    COALESCE(b.value, 0) = 0;
我们也可以用总和表示:

WHERE
    status = 'OPEN' AND
    COALESCE(a.value, 0) + COALESCE(b.value, 0) = 0;