2012-11-05 95 views
12

我有一個問題如何在SQL Server 2008中使用ISNULL到所有列名稱?

我試圖google,但看起來他們不喜歡*

我使用SQL Server 2008的

我有以下的數據庫表:

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

如果我需要用一個字符串替換null我知道我這樣做:

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

問題

  • 我如何使用ISNULL()多列名?
  • 是否有可能與*

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

我認爲這將是棘手的,因爲數據類型的,你不能傳遞字符串INT數據類型等等如何使用它我也解決這個問題

更新

好吧,如果我使用ISNULL()數據類型爲int它將返回0 這對我來說是一個值,我如何傳遞空字符串呢?

+2

不,你必須單獨列出每列。 –

+0

爲什麼你需要使用'*'?如果你有字段列表中的列,它不適合你。 –

+1

@MikaelEriksson他不想通過調用isnull來包裝選擇列表中的每一列。試圖治癒症狀,我感覺... –

回答

16

您可以使用ISNULL多次在不同列中的同一個SQL語句,但你必須把它分開來寫的每一列:

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 

如果你正在建設一個動態的SQL查詢,理論上可以聚集表中列的列表,並在每個列上使用ISNULL生成查詢。例如:將一些列類型等時間戳一個nvarchar時

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 

此代碼有問題,但它說明了該技術。

需要注意的是,如果你有應返回如果值爲null另一列,您可以使用COALESCE表達這樣的:

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

嘗試......

ISNULL(COALESCE(列1,列2),「無數據」)

您將需要雖然包括所有的列名,不能使用*

COALESCE返回第一個非空值它的參數列表,所以如果他們都爲null它將返回空

相關問題