【问题标题】:SQL how to find non null column?SQL如何找到非空列?
【发布时间】:2010-11-22 22:44:45
【问题描述】:

我有一个有很多列的表,比如说我有列

A、B、C、D

在每一列中,任何一条记录中只有一列将被填充,其他列将始终为 NULL。

我需要一个将返回非空列的列的选择语句。

我尝试过合并,但这会返回一个值,而不是该值所属的列。

有人知道最简单的方法吗?

【问题讨论】:

  • SQL 查询只能返回值,不能返回列。您当然可以将该值解释为列名。
  • 是的,你是对的,我推断由于一列包含非空值,这就是我感兴趣的列。
  • 这看起来真是个坏主意
  • 怎么样,我知道 Pax 说这是一个糟糕的架构设计,但是由于我知道列不会增加,我真的需要添加所有额外的复杂性吗?包括另一个查找表,以及代码库中的更多更改?请展开

标签: sql null coalesce


【解决方案1】:

我会重新设计。事实证明,以这种方式而不是在相关表中存储数据几乎是一个坏主意。

在相关表中您可以更轻松地查询信息。您还可以更轻松地对数据进行限制,即只允许一条记录,因此您可能会有更好的数据完整性。

更少的表并不一定意味着更快的访问或更好的关系数据库设计。设计和索引的相关表通常都很好。虽然您可能认为您永远不需要第五列,但业务规则发生了变化,而且我看到许多人们认为不需要扩展的东西,结果却需要扩展。

【讨论】:

    【解决方案2】:

    每当您发现自己尝试使用多列集进行操作时,您的架构都可能有误。

    几乎可以肯定,将 A、B、C 和 D 分成单独表中的单独行,将它们绑定回原始表中的行并创建 JOIN-type 查询会更容易。

    或者,如果只有一个是非空的,我会选择两列,类型(A、B、C 或 D)和值。这样您就不会浪费每一行中的列,并且查询变得无比容易(假设类型相同)。

    但是,您可以使用case这样做:

    select case
        when A is not null then 'A'
        when B is not null then 'B'
        when C is not null then 'C'
        else                    'D'
        end
    from ...
    

    语法可能不完全正确,您需要查一下。 I这不是我通常做的事情,因为我认为这是一个坏主意(select never 中的每行函数可以很好地扩展)。

    【讨论】:

    • 感谢 Pax 提供这些信息,我曾想过实际上只有两列,最初,例如:ModuleType 和 ModuleID,但后来我需要维护另一个表!但你可能对缩放是正确的。我认为在这种情况下,我知道这些列不太可能改变(例如扩大规模)
    • ModuleID 的“查找”表意义上的另一个表。也应该输入'nugget'哎呀:o)
    【解决方案3】:

    不漂亮,但这是你想要的:

    select case 
        when a is not null then 'a' 
        when b is not null then 'b' 
        when c is not null then 'c' 
        when d is not null then 'd' 
    end
    

    【讨论】:

      【解决方案4】:

      尝试案例...

      SELECT
      CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols
      FROM YourTable
      

      【讨论】:

        【解决方案5】:
        SELECT
            CASE
                WHEN A IS NOT NULL THEN 'A'
                WHEN B IS NOT NULL THEN 'B'
                WHEN C IS NOT NULL THEN 'C'
                WHEN D IS NOT NULL THEN 'D'
            END
        FROM
            MyTable
        

        【讨论】:

        • 效果很好!有时简单是最好的,不知道为什么我在想这个问题:o)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 2020-12-13
        • 2012-03-20
        • 2016-03-22
        相关资源
        最近更新 更多