我有一张有很多列的表,比如说我有列
A B C D
在每一列中,任何一条记录中只有一列将被填充,其他列将始终为 NULL。
我需要一个将返回非空列的列的选择语句。
我试过合并,但这会返回一个值,而不是该值所属的列。
有人知道最简单的方法吗?
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
试试案例...
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
每当您发现自己尝试使用多列集进行操作时,您的架构可能是错误的。
几乎可以肯定,将 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 中的每行函数永远不会很好地扩展)。
不漂亮,但这可以满足您的要求:
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
我会重新设计。事实证明,以这种方式而不是在相关表中存储数据几乎是一个坏主意。
在相关表中,您可以更轻松地查询信息。您还可以更轻松地对数据进行限制,即只允许一条记录,因此您可能会有更好的数据完整性。
更少的表并不一定意味着更快的访问或关系数据库中更好的设计。设计和索引的相关表通常都很好。虽然您可能认为您永远不需要第五列,但业务规则发生了变化,而且我看到许多人们认为不需要扩展的东西,结果却需要扩展。