2012-11-05 37 views
12

Tôi có một câu hỏiLàm cách nào chúng ta có thể sử dụng ISNULL cho tất cả các tên cột trong SQL Server 2008?

Tôi cố gắng để google nó, nhưng hình như họ không thích *

Tôi đang sử dụng SQL Server 2008.

Tôi có bảng cơ sở dữ liệu sau đây:

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder 
------------------------------------------------------------------------ 
    1 Jarlsberg 10.45     16 15 
    2 Mascarpone Null     23 NULL 
    3 Gorgonzola 15.67     9 20 

Nếu tôi cần thay thế null bằng một chuỗi tôi biết tôi làm:

SELECT ISNULL(UnitsOnOrder,'No Data') FROM tbl 

Câu hỏi

  • Làm thế nào tôi có thể sử dụng ISNULL() với tên đa cột?
  • là nó có thể sử dụng nó với *

Giống như

SELECT ISNULL(* , 'NO data') FROM tbl 

Tôi nghĩ rằng đây sẽ là khó khăn vì các kiểu dữ liệu, bạn không thể vượt qua chuỗi để INT datatype vậy làm thế nào có thể Tôi cũng sửa lỗi này

Cập nhật

Được rồi nếu tôi sử dụng ISNULL() với kiểu dữ liệu là int, nó sẽ trả lại 0 sẽ là một giá trị đối với tôi, làm cách nào để chuyển chuỗi trống?

+2

Không, bạn phải liệt kê riêng từng cột. –

+0

Tại sao bạn cần sử dụng '*'? Nó không hoạt động cho bạn nếu bạn có các cột trong danh sách trường. –

+1

@MikaelEriksson Anh ấy không muốn bao bọc tất cả các cột trong danh sách lựa chọn với một cuộc gọi đến isnull. Đang cố gắng để chữa một triệu chứng, tôi cảm thấy ... –

Trả lời

16

Bạn có thể sử dụng ISNULL nhiều lần trong các câu lệnh SQL tương tự cho các cột khác nhau, nhưng bạn phải viết nó riêng cho từng cột:

SELECT 
    ISNULL(ProductName, 'No Data') AS ProductName, 
    ISNULL(CAST(UnitPrice AS NVARCHAR), 'No Data') AS UnitPrice, 
    ISNULL(CAST(UnitsInStock AS NVARCHAR), 'No Data') AS UnitsInStock, 
    ISNULL(CAST(UnitsOnOrder AS NVARCHAR), 'No Data') AS UnitsOnOrder 
FROM tbl 

Nếu bạn đang xây dựng một truy vấn SQL động, bạn về mặt lý thuyết có thể thu thập một danh sách các cột trong bảng và tạo truy vấn với ISNULL trên mỗi bảng. Ví dụ:

DECLARE @SQL nvarchar(max) 

SET @SQL = 'SELECT ' 

SELECT @SQL = @SQL + 'ISNULL(CAST([' + sc.name + '] AS NVARCHAR), ''No Data'') AS [' + sc.name + '],' 
FROM sys.objects so 
INNER JOIN sys.columns sc ON sc.object_id = so.object_id 
WHERE so.name = 'tbl' 

-- Remove the trailing comma 
SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ' FROM tbl' 

EXEC sp_sqlexec @SQL 

Mã này có vấn đề khi chuyển đổi một số loại cột như dấu thời gian thành nvarchar, nhưng nó minh họa kỹ thuật.

Lưu ý rằng nếu bạn có một cột nên được trả lại nếu một giá trị là null, bạn có thể sử dụng biểu thức COALESCE như thế này:

SELECT COALESCE(ProductName, P_Id) AS Product... 
1

Hãy thử này ...

ISNULL (liên hiệp (column1, column2), 'Không có dữ liệu')

Bạn sẽ cần phải bao gồm tất cả các tên cột tuy nhiên, bạn không thể sử dụng *

liên hiệp trả về giá trị null không đầu tiên trong danh sách đối số của nó vì vậy nếu tất cả đều là null, nó sẽ trả lại null

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