[英]Select values from multiple columns into single column
我在数据库中有一个表,该表有9列包含相同类型的数据,这些值允许为null 。 我需要将每个非空值都选择到单列的值中,这些值不关心它们源自的行的身份。
因此,对于一个看起来像这样的表:
+---------+------+--------+------+
| Id | I1 | I2 | I3 |
+---------+------+--------+------+
| 1 | x1 | x2 | x7 |
| 2 | x3 | null | x8 |
| 3 | null | null | null|
| 4 | x4 | x5 | null|
| 5 | null | x6 | x9 |
+---------+------+--------+------+
我希望将每个以x开头的值选择到一列中。 我得到的数据应如下表所示。 需要保留顺序,因此第一行的第一列值应该在顶部,而最后一行的最后列值应该在底部:
+-------+
| value |
+-------+
| x1 |
| x2 |
| x7 |
| x3 |
| x8 |
| x4 |
| x5 |
| x6 |
| x9 |
+-------+
我正在使用SQL Server 2008 R2 。 是否有比从每行依次选择每一列的值并将非空值插入结果更好的技术呢?
您可以使用UNPIVOT函数获得最终结果:
select value
from yourtable
unpivot
(
value
for col in (I1, I2, I3)
) un
order by id, col;
由于您使用的是SQL Server 2008+,因此还可以将CROSS APPLY与VALUES子句一起使用来取消透视列:
select value
from yourtable
cross apply
(
values
('I1', I1),
('I2', I2),
('I3', I3)
) c(col, value)
where value is not null
order by id, col
SELECT value FROM (
SELECT ID, 1 AS col, I1 AS [value] FROM t
UNION ALL SELECT ID, 2, I2 FROM t
UNION ALL SELECT ID, 3, I3 FROM t
) AS t WHERE value IS NOT NULL ORDER BY ID, col;
尝试如下所示的并集:
select value from
(
select col1 as value from TestTable
union
select col2 as value from TestTable
union
select col3 as value from TestTable
) tt where value is not null
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.