将常量转换为单独的列到行

时间:2013-07-22 17:48:01

标签: sql sql-server

我一直试图找到最基本的是实现这一目标,但我无法做到。我有一个简单的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,因为它需要一个聚合函数。

2 个答案:

答案 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' 

虽然没有看到“真正的”查询,但不确定这是否适合您的情况。