1

I've been trying to find the most basic was to achieve this, but I have not been able to. I have a simple SQL statement:

SELECT 'Column_a','Column_ab','Column_ac','Column_ad' 

which returns

(No column name)    (No column name)    (No column name)    (No column name)
----------------    ----------------    ----------------    ----------------
Column_a            Column_ab           Column_ac           Column_ad

What I really want is to get:

Column_a
Column_ab
Column_ac
Column_ad

I can't use Pivot since it requires an aggregate function.

4

2 回答 2

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;

(实际上,这只有在所有字符串长度相同时才能正常工作。否则您会收到以下错误消息。)

消息 8167,级别 16,状态 1
列“b”的类型与 UNPIVOT 列表中指定的其他列的类型冲突。

要解决这个问题,您需要用明确CONVERT的相同类型和长度包装每个不是最常见长度的常量(首先放置最长的字符串没有帮助,因为它可能在其他一些情况下)。否则,该VALUES方法似乎更清洁。

于 2013-07-22T17:52:48.783 回答
1

好吧,最基本的方法是UNION ALL

SELECT 'Column_a'
UNION ALL
SELECT 'Column_ab'
UNION ALL
SELECT 'Column_ac'
UNION ALL 
SELECT 'Column_ad' 

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

于 2013-07-22T17:51:38.363 回答