SQL Server資料庫中處理空值時常見問題
用 COUNT(*)處理空值
大多數集合函式都能在計算時消除空值;COUNT 函式則屬於例外。對包含空值的一個列使用 COUNT 函式,空值會從計算中消除。但假如 COUNT 函式使用一個星號,它就計算所有行,而不管是否存在空值。
如果希望 COUNT 函式對給定列的所有行(包括空值)進行計數,請使用 ISNULL 函式。ISNULL 函式會將空值替換成有效的值。
事實上,對集合函式來說,如果空值可能導致錯誤結果,ISNULL 函式就非常有用。記住在使用一個星號時,COUNT 函式會對所有行進行計算。下例演示了空值在 AVG 和 COUNT 集合函式中的影響:
以下為引用的內容:
SET NOCOUNT ON
GO
CREATE TABLE xCount
(pkey1 INT IDENTITY NOT NULL
CONSTRAINT pk_xCount PRIMARY KEY,
Col1 int NULL)
GO
INSERT xCount (Col1) VALUES (10)
GO
INSERT xCount (Col1) VALUES (15)
GO
INSERT xCount (Col1) VALUES (20)
GO
INSERT xCount (Col1) VALUES (NULL)
GO
SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,
AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,
COUNT(Col1) NoIsNullFunctionOnCol1 ,
COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,
Count(*) UsingAsterisk
FROM xCount
GO
DROP TABLE xCount
GO
OUTPUT:
AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1
WOIsNullFnctnCol1
WIsNullFnctnCol1 UsingAsterisk
---------------- ------------- --------------
恰當使用空表值
SQL Server 可能出現一種特殊情況:在引用父表的一個表中,因為不允許空值,所以“宣告引用完整性”(DRI)可能不會得到強制。即使父表不包含空值,在子表引用了父表主鍵約束或惟一約束的列中,也可能包含空值。
假如來自父表的值目前未知,就不會有任何問題。例如,父表可能是一個地址表,而子表可能包含聯絡資訊。由於許多原因,可能暫時不知道要傳給父表的聯絡地址。這是一種基於時間的問題,空值在其中或許是合適的。
如下例所示,我們建立父表,並在其中插入兩個值。
以下為引用的內容:
SET NOCOUNT ON
GOCREATE TABLE Parent(pkey1 INT IDENTITY NOT NULL
CONSTRAINT pkParent PRIMARY KEY,col1 INT NULL)GOINSERT
Parent (col1) VALUES (284)GOINSERT
Parent (col1) VALUES (326)GO
以下程式碼則建立子表,並在引用父表的列中插入一個空值。
以下為引用的內容:
CREATE TABLE Child
(pkey1 INT IDENTITYCONSTRAINT pkChild
PRIMARY KEY,Parentpkey1 INT NULLCONSTRAINT fkChildParent
FOREIGN KEYREFERENCES Parent(pkey1),col1 INT NULL)
GOINSERT Child (Parentpkey1, col1) VALUES (null,2)GO
但在以下程式碼中,要同時從父表和子表選擇值。雖然父表不包含空值,但在子表引用了父表的那個列中,將允許一個空值。
然後丟棄所有表,清除這個演示所用的資料庫物件。
以下為引用的內容:
SELECT * FROM ChildGOSELECT * FROM
ParentGODROP TABLE Child, ParentGO
在可以為空的外來鍵中檢查資料的有效性
如果由兩個列共同組成主鍵,而且一個子表將主鍵作為可為空值的外來鍵來繼承,就可能得到錯誤的資料。可在一個外來鍵列中插入有效的值,但在另一個外來鍵列中插入空值。然後,可新增一個資料表檢查約束,在可為空的外來鍵中檢查資料的有效性。
任何多列外來鍵都可能遇到同樣的問題。所以,你需要新增一個檢查約束來檢測異常。最初,檢查約束將檢查構成外來鍵的所有列中可能為空的值。檢查約束還要檢查這些列中不能為空的值。如兩個檢查都通過,問題就解決了。
以下示範指令碼展示了這樣的一個異常,以及如何用檢查約束來糾正它。
空值是所有資料庫開發者和管理員都要遇到的。所以,要想開發成功的應用程式,必須知道如何處理這些值。本文和你分享了空值處理的一些技巧和技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-539628/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server資料庫恢復常見問題SQLServer資料庫
- Sql Server 資料庫超時問題SQLServer資料庫
- SQL Server常見問題收集SQLServer
- 資料庫常見問題資料庫
- 資料庫面試時常見的26個問題資料庫面試
- sql server2008資料庫複製實現資料同步常見問題SQLServer資料庫
- Sql Server資料庫類似正規表示式的字元處理問題SQLServer資料庫字元
- RDSforMySQLMysqldump常見問題和處理ORMMySql
- HTML + CSS處理常見問題HTMLCSS
- Zabbix 常見問題處理整理
- 常見資料庫SYBASE和SQL SERVER的比較資料庫SQLServer
- Sql server資料庫人員:常見錯誤(轉)SQLServer資料庫
- SQL Server 連線常見錯誤及其處理方法SQLServer
- 用SQL Server資料庫處理資料層錯誤SQLServer資料庫
- GoldenGate常見問題及處理Go
- Redis 快取常見問題處理Redis快取
- sql server 資料庫還原問題SQLServer資料庫
- iOS開發中兩個常見問題的處理iOS
- 五個常見 PHP 資料庫問題PHP資料庫
- SQL Server 2005常見問題淺析SQLServer
- Oracle資料庫中的逐行處理問題NEOracle資料庫
- Mac遊戲安裝常見問題處理Mac遊戲
- vue中當資料為空時的處理Vue
- 常見資料庫系統之比較 - SYBASE 和 SQL SERVER(轉)資料庫SQLServer
- SQL Server 2005映象設定常見錯誤處理SQLServer
- 10個常見的資料庫安全問題資料庫
- 五個常見 PHP 資料庫問題(轉)PHP資料庫
- SQL Server 異常程式碼處理SQLServer
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- 常見面試SQL問題面試SQL
- 大資料常見問題大資料
- 常見問題--plsql處理ora-28000SQL
- 深入SQL Server資料庫速度提升問題(一)SQLServer資料庫
- 深入SQL Server資料庫速度提升問題(二)SQLServer資料庫
- 如何處理SQL Server2000 中的suspect 置疑的資料庫SQLServer資料庫
- SQL Server 資料庫開發中的十大問題VYSQLServer資料庫
- 資料庫響應慢問題處理資料庫
- 解決SQL Server常見的七個經典問題SQLServer