代码之家  ›  专栏  ›  技术社区  ›  Darknight

SQL如何查找非空列?

  •  5
  • Darknight  · 技术社区  · 17 年前

    我有一张有很多列的桌子,比如说我有列

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

    我需要一个select语句,它将返回非空列的Column。

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

    5 回复  |  直到 12 年前
        1
  •  8
  •   Robin Day    17 年前
    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
    
        2
  •  4
  •   Rob Farley    17 年前

    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
    
        3
  •  3
  •   paxdiablo    17 年前

    几乎可以肯定,在单独的表中将A、B、C和D分成单独的行,将它们绑定回原始表中的行,并创建一个 JOIN

    或者,如果只有一列是非NULL的,我会选择两列,类型(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 ...
    

    语法可能不完全正确,您需要查找。我通常不会这样做,因为我认为这是个坏主意(select中的每行函数 从不 规模良好)。

        4
  •  2
  •   edosoft    17 年前

    不漂亮,但这符合你的要求:

    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
    
        5
  •  0
  •   HLGEM    17 年前

    更少的表并不一定意味着关系数据库中更快的访问或更好的设计。精心设计和索引的相关表通常都很好。虽然你可能认为你永远不需要第五栏,但商业规则发生了变化,我看到了许多人们认为不需要扩张的事情,结果却需要规模。