SQL如何查找非空列?

时间:2009-08-26 10:03:57

标签: sql null coalesce

我有一个包含大量列的表,比如我有列

  

A,B,C,D

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

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

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

任何人都知道最简单的方法吗?

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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

答案 2 :(得分:3)

每当您发现自己尝试使用多列集时,您的架构可能就错了。

将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 ...

语法可能不完全正确,您需要查找它。我认为这不是我经常做的事情,因为我认为这是一个坏主意(选择从不规模的每行功能)。

答案 3 :(得分:2)

不漂亮,但这可以满足您的需求:

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 :(得分:0)

我会重新设计。以这种方式存储数据而不是在相关表中存储数据几乎是alawys。

在相关表格中,您可以更轻松地查询信息。您还可以更轻松地对只允许一条记录的数据设置约束,这样您可能会有更好的数据完整性。

较少的表并不一定意味着在关系数据库中更快地访问或更好的设计。通常设计和索引的相关表通常都很好。虽然你可能认为你不会需要第五列,但业务规则会发生变化,而且我已经看到很多人认为不需要扩展的东西需要可靠性。