2013-12-17 122 views
2

我有一个字段名称DAILYREPORT.WEATHERCONDITION,它可以根据用户从天气检查列表中选择的值将值保存为'1,2,3'或'1'或'2,4'可供他使用的盒子。天气表格包含了他选择返回逗号分隔值SQL

Weather Table 

ID Condition 
---------- 

1 Sunny  
2 Cloudy 
3 Fine  
4 Windy 

现在我需要查询时DAILYREPORT.WEATHERCONDION=1,2,3

+0

对不起..我的坏..我使用sql-server – user1699025

+0

http://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group-concat-in-sql-server –

+0

@SchlaWiener :) –

回答

2
DECLARE @list VARCHAR(MAX) 
SELECT @list = COALESCE(@list+',' ,'') + Condition 
FROM Weather 
WHERE ID IN (1,2,3) 
SELECT @list 

您声明varchar类型的@list变量返回的条件'Sunny,Cloudy,Fine'天气名单。然后使用COALESCE表达式(请看这里http://msdn.microsoft.com/en-us/library/ms190349.aspx了解它的工作原理的进一步细节),你会得到你想要的。

这是一个SQL小提琴是表明上述作品预计

http://sqlfiddle.com/#!6/65df2/1

注意:为了避免任何误解,我不说,COALESCE解决了上述问题。

它只是在那里处理初始化字符串和最后一个额外逗号问题 。

as Mikael在下面写道。

+1

我不认为downvote是因为代码。代码起作用。然而,关于它如何工作的描述却是错误的。合并与连接字符串无关。连接字符串是用'+'完成的,这段代码使用了一个未记录(据我所知)的特性,即select语句中每一行的变量都会被更新。 'coalesce'只是在那里处理初始化字符串和最后一个额外逗号的问题。 http://sqlfiddle.com/#!6/65df2/3 –

+0

@Mikael感谢您的评论,因为我对downvote感到困惑。 downvoter应该留下评论,以便更好地回答或删除它。但是,我并没有在上面说明COALESCE解决了这个问题。再次感谢 ! – Christos

4

试试这个:

SELECT STUFF 
(
    (select ',' + Condition 
     from 
     Weather 
     where 
     ID in (1,2,3) 
     FOR XML PATH('') 
    ),1,1,'' 
) 
0

试试这个,我希望它是有用的你

select SUBSTRING(
(select ','+ s.condition from DAILYREPORT s where id in (1,2,3) order by condition for xml path('')),2,200000) as CSV 
2

矿是同克里希纳,

Declare @Weather Table (ID int, Condition varchar(50)) 
insert into @Weather values(1,'Sunny'),(2,'Cloudy'),(3,'Fine'),(4,'Windy') 

select top 1 
stuff((select ','+Condition from @Weather b where id in(1,2,3) for xml path('')),1,1,'')Condition 

from @Weather