我一直试图找到最基本的是实现这一目标,但我无法做到。我有一个简单的SQL语句:
SELECT 'Column_a','Column_ab','Column_ac','Column_ad'
返回
(No column name) (No column name) (No column name) (No column name)
---------------- ---------------- ---------------- ----------------
Column_a Column_ab Column_ac Column_ad
我真正想要的是:
Column_a
Column_ab
Column_ac
Column_ad
我不能使用Pivot,因为它需要一个聚合函数。
答案 0 :(得分:3)
在SQL Server 2008及更高版本上,您可以稍微重写一下:
SELECT x FROM (VALUES
('Column_a'),('Column_ab'),('Column_ac'),('Column_ad')
) AS y(x);
结果:
x
---------
Column_a
Column_ab
Column_ac
Column_ad
虽然请记住,除非您添加其他专栏以协助订购,否则无法保证它们是按照书面订购的。在这种情况下,恰好是你按字母顺序编写它们,所以你可以ORDER BY x
,但这只是一个幸运的巧合。
具有类似警告的UNPIVOT
示例,虽然只是使用其他代码包装原始查询的优势:
SELECT x FROM
(
SELECT 'Column_a', 'Column_ab', 'Column_ac', 'Column_ad'
) AS p(a,b,c,d)
UNPIVOT (x FOR cols IN (a,b,c,d)) AS up;
(实际上,只有在所有字符串长度相同的情况下才能正常工作。否则会出现以下错误消息。)
Msg 8167,Level 16,State 1
列“b”的类型与UNPIVOT列表中指定的其他列的类型冲突。
要解决这个问题,你需要将每个不是最常见长度的常量用明确的CONVERT
包装到相同的类型和长度(首先放置最长的字符串没有帮助,因为它可能在其他一些情况下)。否则,VALUES
方法似乎更清晰。
答案 1 :(得分:1)
嗯,最基本的方法是使用UNION ALL
:
SELECT 'Column_a'
UNION ALL
SELECT 'Column_ab'
UNION ALL
SELECT 'Column_ac'
UNION ALL
SELECT 'Column_ad'
虽然没有看到“真正的”查询,但不确定这是否适合您的情况。