2010-05-26 50 views
64

Tôi đang tạo cột được tính trên các trường trong đó một số có khả năng là rỗng.Chuỗi máy chủ SQL Ghép nối với Null

Vấn đề là nếu bất kỳ trường nào trong số đó là null, toàn bộ cột được tính sẽ không có giá trị. Tôi hiểu từ tài liệu của Microsoft rằng điều này được mong đợi và có thể được tắt thông qua thiết lập SET CONCAT_NULL_YIELDS_NULL. Tuy nhiên, có tôi không muốn thay đổi hành vi mặc định này bởi vì tôi không biết ý nghĩa của nó trên các phần khác của SQL Server.

Có cách nào để tôi chỉ kiểm tra xem cột có rỗng hay không và chỉ chắp thêm nội dung của nó trong công thức cột được tính nếu nó không rỗng?

Trả lời

110

Bạn có thể sử dụng ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '') 

Nếu giá trị của cột/biểu hiện thực sự là NULL, thì giá trị thứ hai quy định (ở đây: chuỗi rỗng) sẽ được sử dụng để thay thế.

+13

"Kết hợp" là tên hàm tiêu chuẩn ANSI, nhưng ISNULL dễ đánh vần hơn. –

+1

Và ISNULL có vẻ nhanh hơn trên SQL Server - vì vậy nếu bạn muốn sử dụng nó trong một hàm kết nối chuỗi thành cột được tính toán, bạn có thể từ bỏ tiêu chuẩn ANSI và chọn tốc độ (xem Adam Machanic: http: //sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx) –

+0

Chỉ cần sử dụng truy vấn Isnull (,) này, nó bị nhiễm rất nhiều khi tôi đã ghép các giá trị với nhau và nếu một trong số đó là vô giá trị mọi thứ trở thành vô giá trị. – Sizons

27

Sử dụng COALESCE. Thay vì your_column, hãy sử dụng COALESCE(your_column, ''). Điều này sẽ trả về chuỗi rỗng thay vì NULL.

6

ISNULL(ColumnName, '')

0

Trong Sql Server:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]') 

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL. 

Mã Đằng sau:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'"; 
string email = txtEmail.Text; 

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"') 
7

Tôi chỉ muốn đóng góp này có người nên tìm kiếm sự giúp đỡ với việc thêm dải phân cách giữa các dây, tùy thuộc vào cho dù một trường là NULL hay không.

Vì vậy, trong ví dụ của việc tạo ra một địa chỉ một dòng từ lĩnh vực riêng biệt

Address1, Address2, Address3, Thành phố, mã bưu điện

trong tôi trường hợp, tôi có Cột được Tính toán sau có vẻ như đang hoạt động như tôi muốn:

case 
    when [Address1] IS NOT NULL 
    then (((   [Address1]  + 
      isnull(', '+[Address2],'')) + 
      isnull(', '+[Address3],'')) + 
      isnull(', '+[City] ,'')) + 
      isnull(', '+[PostCode],'') 
end 

Hy vọng sẽ giúp ai đó!

+0

Có khá nhiều giá trị lồng nhau dự phòng ở đó có thể bị xóa. Một mẹo khác là bạn cũng có thể loại bỏ tuyên bố trường hợp như thể address1 là null toàn bộ biểu thức sẽ đánh giá là null (mặc dù có câu lệnh case thu hút sự chú ý rằng điều này có thể xảy ra) – Alternator

38

Từ SQL Server 2012, việc này dễ dàng hơn nhiều với chức năng CONCAT.

Nó xử lý NULL như chuỗi rỗng

DECLARE @Column1 VARCHAR(50) = 'Foo', 
     @Column2 VARCHAR(50) = NULL, 
     @Column3 VARCHAR(50) = 'Bar'; 


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/ 
+0

Cảm ơn! Đây là những gì tôi cần !! – Shiva

+0

Đối với các phiên bản cũ hơn, bạn nhận được "'CONCAT' không phải là tên hàm được tích hợp sẵn", vì vậy hãy sử dụng COALESCE – Savage

7

Bạn cũng có thể sử dụng CASE - mã của tôi dưới đây kiểm tra cho cả hai giá trị vô giá trị và chuỗi rỗng, và cho biết thêm một seperator chỉ nếu có một giá trị để làm theo:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 
10

Sử dụng

SET CONCAT_NULL_YIELDS_NULL OFF 

và nối các giá trị null cho một st vòng sẽ không dẫn đến null.

Xin lưu ý rằng đây là tùy chọn không được chấp nhận, tránh sử dụng. Xem documentation để biết thêm chi tiết.

0

Tôi cũng gặp nhiều rắc rối với điều này. Không thể làm cho nó hoạt động bằng cách sử dụng các ví dụ điển hình ở trên, nhưng điều này thực hiện công việc cho tôi:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),' ',' ') 

Thay thế các khoảng trống đôi bằng cách nối các khoảng trống đơn không có gì giữa chúng. r/ltrim loại bỏ mọi khoảng trống ở cuối.

Các vấn đề liên quan