2009-10-14 43 views
10

Tôi tryin để sử dụng SQL để xây dựng một dấu phẩy tách ra danh sách các cat_id củaTạo danh sách được phân cách bằng dấu phẩy?

mã là:

declare  @output varchar(max) 
set   @output = null; 
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id) 

chỉnh sửa: thay đổi '' để null, VẪN cùng. nhưng đầu ra im nhận được như vậy:

, 66 , 23 

dấu phẩy hàng đầu không nên ở đó. Tôi đã bỏ lỡ điều gì?

Trả lời

37

Bạn có đang sử dụng SQL 2005 không? Với đạo cụ để Rob Farley người chỉ cho tôi điều này chỉ thời gian gần đây:

SELECT stuff((
    SELECT ', ' + cast(cat_id as varchar(max)) 
    FROM categories 
    FOR XML PATH('') 
    ), 1, 2, ''); 

Truy vấn bên trong (với FOR XML PATH('')) chọn một danh sách bằng dấu phẩy của ID danh mục, với một hàng đầu "". Truy vấn bên ngoài sử dụng chức năng stuff để xóa dấu phẩy và dấu cách hàng đầu.

Tôi không có một cá thể SQL tiện dụng để kiểm tra điều này, do đó, nó từ bộ nhớ. Bạn có thể phải chơi với các thông số công cụ vv để làm cho nó hoạt động chính xác theo cách bạn muốn.

+0

Ok, tôi đã thử nghiệm nó và nó hoạt động như nó vốn có. Tôi chắc chắn muốn giới thiệu điều này qua kỹ thuật 'nối thêm một biến'. –

+1

Thuật sĩ sql hoang dã này bạn đã thể hiện ở đây! Bắt đầu quỷ! – JDPeckham

+0

Tôi muốn nối thêm vào câu trả lời này - đối với rất nhiều câu lệnh STUFF bạn muốn tham số là 1 và 1, không phải 1 và 2 để tạo danh sách được phân tách bằng dấu phẩy thực sự. Câu trả lời của Matt sử dụng 2 vì anh ta có một dấu cách sau mỗi dấu phẩy. Để biết thêm thông tin, hãy xem bài viết MSDN: http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman

0

séc @output giá trị ngay trước khi thực hiện các truy vấn này, tôi nghĩ rằng nó không phải bằng NULL nhưng để '' (trống string)

EDIT: (sau khi @auth edited các câu hỏi)

nay tôi chắc chắn đó là '',

bạn phải khởi tạo nó để NULL

để làm điều đó một cách độc lập của CONCAT_NULL_YIELDS_NULL, sử dụng cũ CASE WHEN:

select @output = NULL 
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value 
+0

ngay cả khi đó 'CONCAT_NULL_YIELDS_NULL' cần được đặt thành' ON' –

+0

đúng, cảm ơn, tôi đã không Không biết một tùy chọn tồn tại! – manji

0

Bạn đã khởi tạo @output thành một chuỗi rỗng? COALESCE sẽ chỉ hoạt động nếu đó là chuỗi NULL.

0

Điều bạn đang làm sai là @output không phải là null từ đầu, mà là một chuỗi rỗng. Đặt @output thành null trước vòng lặp (hoặc nếu nó không được sử dụng vì nó được khai báo chỉ không gán một chuỗi rỗng cho nó).

2

liên hiệp Returns the first nonnull expression among its arguments

Đầu luận @output + ', ' không bao giờ là null (trừ khi bạn khởi @output như là null VÀ thiết CONCAT_NULL_YIELDS_NULL-ON), vì vậy nó luôn được trả về.

+1

+1 cho con trỏ đến thuộc tính ANSI. Sử dụng "select sessionproperty ('CONCAT_NULL_YIELDS_NULL')" để xem giá trị hiện tại của nó; nó là 1 theo mặc định, nhưng nếu nó là 0, nó sẽ khiến COALESCE của poster bị lỗi. – Andomar

0

Và đôi khi ...

bạn phải trả lời câu hỏi của riêng bạn

declare  @output varchar(max) 
select  @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id) 
1
declare  @output varchar(max) 

select  @output = coalesce 
         ( 
          @output + ', ' + convert(varchar(max),cat_id), 
          convert(varchar(max),cat_id) 
        ) 
from  yourTableHere 

print  @output 
0

Không chắc nếu điều này được áp dụng một cách chính xác những gì bạn đang tìm kiếm, nhưng tôi thấy điều này ngay tại đồng thời tôi đã tìm thấy câu hỏi của bạn. Tôi sử dụng giải pháp thứ hai với FOR XML PATH, mà Matt Hamilton đã đề cập ở trên. Nó làm việc rất tốt cho tôi.

Hàng trùng khớp - Theo Carl P.Anderson, 2009/10/14

http://www.sqlservercentral.com/articles/T-SQL/67973/

0
/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h 
1,COMO INTERNAL 2,700,90 
7,LOADIVR,10,80 
10,SPEECH_IVR_PROD,600,95 
Các vấn đề liên quan