5

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

A B C D

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

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

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

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

4

5 回答 5

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
于 2009-08-26T10:07:07.103 回答
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
于 2009-08-26T10:08:35.010 回答
3

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

几乎可以肯定,将 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 中的每行函数永远不会很好地扩展)。

于 2009-08-26T10:13:24.940 回答
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
于 2009-08-26T10:09:59.733 回答
0

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

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

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

于 2009-08-26T18:20:50.240 回答