我有一个包含大量列的表,比如我有列
A,B,C,D
在每个列中,任何一条记录中只会填充一列,其他列将始终为NULL。
我需要一个select语句,它将返回非空列的列。
我尝试过合并,但这会返回一个值,而不是值所属的列。
任何人都知道最简单的方法吗?
答案 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。
在相关表格中,您可以更轻松地查询信息。您还可以更轻松地对只允许一条记录的数据设置约束,这样您可能会有更好的数据完整性。
较少的表并不一定意味着在关系数据库中更快地访问或更好的设计。通常设计和索引的相关表通常都很好。虽然你可能认为你不会需要第五列,但业务规则会发生变化,而且我已经看到很多人认为不需要扩展的东西需要可靠性。