SQL检查多个匹配列

时间:2014-07-10 20:01:51

标签: sql oracle select

如果我有一个带有列的表Q:IDNUMBER,A,B,C,D,E,F,G,H;

每个字母列都包含数字但可以为空。假设有数千行,我想找到每个IDNUMBER没有匹配数据的所有行(A == B == C == D == E == F == G == H)。但是,我想完全忽略空值。

表格看起来像这样(n表示空):

IDNUMBER |  A |  B  | C  | D |  E |  F |  G 
---------+----+-----+----+---+----+----+----
  100    |  6 |  6  | 6  | 6 |  6 |  6 |  6 
  101    |  n |  n  | n  | n |  5 |  5 |  5
  102    |  3 |  3  | 3  | 4 |  3 |  3 |  3 
  103    |  3 |  n  | 5  | n |  5 |  n |  5

我想返回IDNUMBER为102和103的行,因为它们的NON-NULL值不匹配。我不想返回IDNUMBER为100和101的行,因为它们的NON-NULL值匹配。

有人可以提供适用于此的SELECT语句吗?

谢谢!

P.S。我使用的是Oracle SQL Developer 4.02.15.21

1 个答案:

答案 0 :(得分:5)

哦,最简单的方法似乎是:

select q.*
from q
where greatest(a, b, c, d, e, f, g) <> least(a, b, c, d, e, f, g);

唉,由于NULL值,这不起作用。这可能会带来挑战。这是一种方法:

select q.*
from q
where greatest(coalesce(a, b, c, d, e, f, g),
               coalesce(b, c, d, e, f, g, a),
               coalesce(c, d, e, f, g, a, b),
               coalesce(d, e, f, g, a, b, c),
               coalesce(e, f, g, a, b, c, d),
               coalesce(f, g, a, b, c, d, e),
               coalesce(g, a, b, c, d, e, f)
              ) <>
      least(coalesce(a, b, c, d, e, f, g),
            coalesce(b, c, d, e, f, g, a),
            coalesce(c, d, e, f, g, a, b),
            coalesce(d, e, f, g, a, b, c),
            coalesce(e, f, g, a, b, c, d),
            coalesce(f, g, a, b, c, d, e),
            coalesce(g, a, b, c, d, e, f)
           ) ;

这会比较每个值,如果在NULL的情况下可用,则会输入一些非NULL值。如果所有值均为NULL,则不说该怎么做。在这种情况下,此表达式不会返回任何内容。