2012-07-13 30 views
5

tôi có giá trị bảng ở định dạng nàyLàm thế nào tôi có thể nhận được giá trị khác biệt trong liên hiệp()

sam 
jack 
sam 
john 

Declare @name varchar(max) 
select @name = COALESCE(@name + ', ','')+ user_email 
from PostedCommentMaster where article_id = @id 

Làm thế nào tôi có thể nhận được giá trị khác biệt

sam,jack,john 

như thế này.

+0

Tại sao bạn sử dụng 'COALESCE' ở đây? Trước tiên, bạn khai báo biến @name, sau đó kiểm tra ngay xem biến đó có rỗng không. Nó sẽ luôn luôn là null, vì nó sẽ không bao giờ được thiết lập để bất cứ điều gì – paul

+0

@paul - Đây là một (không có giấy tờ) cách để nối một cột từ một resultset. –

+1

Tôi hiểu, vì vậy '@ name' thực sự được đánh giá lại mỗi hàng được trả về. tài giỏi. – paul

Trả lời

15

Bạn có thể quấn tuyên bố chọn vào một subselect và áp dụng liên hiệp về kết quả.

Declare @name varchar(max) 

select @name = COALESCE(@name + ', ','') + user_email 
from (select distinct user_email 
     from PostedCommentMaster 
     where article_id = @id) pc 

Lưu ý rằng điều này sử dụng tính năng không có giấy tờ của SQL Server để kết nối các kết quả thành một chuỗi. Trong khi tôi không thể tìm thấy một liên kết đến nó nữa, tôi nhớ lại rằng bạn không nên dựa vào hành vi này.

Một giải pháp thay thế tốt hơn là sử dụng cú pháp FOR XML để trả lại chuỗi được nối. A search on SO trả về nhiều kết quả bạn có thể sử dụng làm ví dụ.

+0

nó làm việc cảm ơn bạn .. –

3

Ở đây bạn đi

Declare @name varchar(max) 
select 
    @name = COALESCE(@name + ', ','')+name from (select distinct user_email 
from 
    PostedCommentMaster) as t 
where 
    article_id = @id 
0

Bạn có thể sử dụng group by để tìm giá trị duy nhất.

Declare @name varchar(max) 
select @name = COALESCE(@name + ', ','')+ user_email 
from PostedCommentMaster where article_id = @id 
group by user_email 
Các vấn đề liên quan