2011-06-03 78 views
10

我们可以在SQL写返回单一静态值选择多个静态值

select "Jan" as StartMonth 

在类似的方式,SQL应该允许写在同一列返回多个值

select {"Jan", "Feb", "Mar"} as Qtr1, {"Apr", "May", "Jun"} as Qtr2 

当我们需要将数据作为表来执行连接,并且数据在Sp级别是未知的,即它来自于参数,所以看起来不需要任务来创建临时表并在临时表中插入拆分值。如果MS SQL服务器中存在此功能,请纠正我。或者更好的方法来使它不是枢轴和临时表。

+0

你打算如何使用它?你能提供一个你想用静态值实现的例子吗? – shahkalpesh 2011-06-03 10:50:06

+0

您是否期望将单个列(即:多行)的结果连接成单个值(即:标量),如逗号分隔的字符串?另外,如果你按照上面的例子对这些进行了严格的编码,那么什么是错误的:选择'Jan,Feb,Mar'为Qtr1,'Apr,May,Jun'为Qtr2? – 2011-06-03 10:50:10

+1

@shah;它是一个通用的问题,我知道还有其他选择,但如果我们可以这样写就会很好。常见的情况是,我们有很多SP,这需要几年时间,以逗号分隔字符串作为报告,我们将它们拆分并存储在临时表中或使用表变量。 – hungryMind 2011-06-03 11:00:49

回答

26

这会给你你想要的吗?

SELECT 'Jan' AS Qtr1, 'Apr' AS Qtr2 
UNION ALL SELECT 'Feb' AS Qtr1, 'May' AS Qtr2 
UNION ALL SELECT 'Mar' AS Qtr1, 'Jun' AS Qtr2 
+4

看起来很酷。你甚至可以使它更短: SELECT'Jan'AS Qtr1,'Apr'AS Qtr2 UNION SELECT'Feb','May' UNION SELECT'Mar','Jun' – Paul 2014-12-23 10:32:20

+0

我有时在CTE中使用它( WITH PARMS AS(SELECT ...))在视图和脚本中进行参数化时,我宁愿不(或不能)声明变量等,或者当我需要一组特殊的静态数据时。这很好,因为我可以将它保持在脚本的顶部。我希望有一个更短的写法,比如hungryMind的建议,但它仍然非常方便! – kwill 2015-05-22 13:04:55

0

这是不可能的,除非您使用像您已经建议的临时表。

0

与SQL Server 2008可以使用表值参数 - 让你可以在数据表传给然后使用/如你所愿的存储过程,而不是在内部具有一个CSV字符串传递加入上你需要拆分。

看看这个MSDN article

+0

是的,但那是2008年,我的客户不会购买它。它不是一个要求,但功能很好。 – hungryMind 2011-06-03 11:47:39

+0

@hungryMind - 好吧,认为值得一提,因为你没有说明你使用的是哪个版本 – AdaTheDev 2011-06-03 12:54:21

1

我知道这个问题被标记,但它是当中的时候我一直在寻找的Postgres答案顶部谷歌的结果,所以here it is for Postgres

此:

VALUES ('Jan', 'Apr'), ('Feb', 'May'), ('Mar', 'Jun'); 

等效于此:

SELECT 'Jan' AS column1, 'Apr' AS column2 
UNION ALL SELECT 'Feb', 'May' 
UNION ALL SELECT 'Mar', 'Jun'