SQL Server CE和SQL Server 2000/2005中的ISNULL函式的異同

iSQlServer發表於2010-03-01

    在對window CE 5.0手持機程式開發過程中,使用了SQL Server CE 3.5的資料庫,由於需要篩選出某個欄位不為空(包括null和"")的情況的資料。故使用ISNULL函式來替換null的情況,然而在使用的過程中, 發現SQL Server CE 中的ISNULL函式和SQL Server 2000或SQL Server 2005中的函式ISNULL不太一樣。為什麼會有這樣的差別呢?帶著問題經過思考找到了答案。

一、先看看一個SQL Server 2000中的SQL語句:

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gtTestIsNull表的全部資料如下:(SELECT * FROM [TestIsNull])

TransactionNumber   Name   WorkName
1                   test1    NULL

2                   test2    NULL

3                   test3    NULL

4                   test4    NULL

5                   test5    NULL

6                   test6    NULL

7                   test6   

8                   test00   workName 

我們使用ISNULL函式

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gtselect TransactionNumber,Name,isnull(WorkName,'') as NewWorkName from TestIsNull

 

 得到的結果集如下:

TransactionNumber   Name     NewWorkName
1                   test1 

2                   test2  

3                   test3

4                   test4 

5                   test5  

6                   test6  

7                   test6

8                   test00   workName 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gt

 

可見SQL Server 2000針對ISNULL函式的用法是(SQL Server 2005也如此):

使用指定的替換值替換 NULL

語法:ISNULL(check_expression,replacement_value)

引數:check_expression 將被檢查是否為NULL的表示式。check_expression可以是任何型別的。

replacement_value 在check_expression為NULL時將返回的表示式。replacement_value必須與check_expression具有相同的型別。

返回值:返回與check_expression相同的型別。

註釋:如果check_expresssion不為NULL,那麼返回該表示式的值;否則返回replacement_value。

 

二、SQL Server CE中的ISNULL的用法。

資料庫的表TestIsNull表結構和資料同上:我們先來看看同樣一條SQL語句在SQL Server CE中查詢出來的資料是什麼?

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gtSELECT transactionNumber, Name, ISNULL(WorkName, ''AS NewWorkName
FROM TestIsNull

 

TransactionNumber Name NewWorkName
1 test1 True
2 test2 True
3 test3 True
4 test4 True
5 test5 True
6 test6 True
7 test6 False
8 test00 False

很明顯和上面用SQL Server 2000查詢出來的結果不一樣。通過觀察發現這裡的ISNULL中的第二個引數無效,這裡只判斷了WorkName欄位是否為NULL,如果為NULL,則ISNULL(WorkName,'')返回值為True,否則為False。

最後通過查詢SQL CE的幫助文件,終於找到原因了:

 官方的SQL Server Compact Edition不支援的ISNULL,但所描述的行為儘管沒有SQL語法錯誤,或者丟擲異常情況。另一個接合函式(COALESCE)可以替代ISNULL的功能,返回第一個非空引數。

我們用COALESCE來模仿上面的ISNULL的寫法:

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtSELECT transactionNumber, Name, COALESCE (WorkName, ''AS NewWorkName
FROM  TestIsNull

 

這樣通過查詢出來的結果集就和SQL Server 2000(或SQL Server 2005)查詢出來的結果集一樣了。

下面簡單介紹一下關於COALESCE函式的用法:

COALESCE 返回其引數中第一個非空表示式。

語法:COALESCE (expression [,...n])

引數:expression:任何型別的表示式。n:表示可以指定多個表示式的佔位符。所有表示式必須是相同型別。或者可以隱式轉換成相同的型別。

返回值:將相同的值作為expression返回。

註釋:如果所有自變數均為NULL,則COLALESCE返回NULL值。COALESCE(expression,...n)與此CASE函式等價:

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtCASE
   
WHEN (expression1 IS NOT NULLTHEN expression1
   ...
   
WHEN (expressionN IS NOT NULLTHEN expressionN
   
ELSE NULL

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-628260/,如需轉載,請註明出處,否則將追究法律責任。

相關文章