【问题标题】:SQL Check for multiple matching columnsSQL 检查多个匹配列
【发布时间】:2014-07-10 20:01:51
【问题描述】:

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

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

表格可能如下所示(n 表示 null):

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 语句吗?

谢谢!

附:我正在使用 Oracle SQL Developer 4.02.15.21

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

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

    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,您不会说该怎么做。在这种情况下,此表达式不会返回任何内容。

    【讨论】:

    • 谢谢,有趣的想法;我用 MAX 和 MIN 函数代替了最大和最小,但是我得到了“这里不允许使用组函数”的错误。我基本上有: SELECT * FROM [subquery] WHERE MAX(...) MIN(...) 有什么想法吗?
    • @TJE97 。 . .在这种情况下,您不能使用 max()min(),因为您的数据是非规范化的。规范化行和使用聚合函数将是另一种方法。
    • 也许我没看懂你写的什么……什么是最大()和最小()?
    • 啊,没关系,我没有意识到它们本身就是有效的函数——我的编辑器没有将它们突出显示为关键字
    猜你喜欢
    • 2017-05-23
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多