資料欄位中有NULL值時,需要特別小心處理
否則查詢時,通常會被遺漏此筆資料

以下簡單透過下列T-SQL語法建立一個測試資料說明


CREATE TABLE [dbo].[myEmployees](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](10) NOT NULL,
	[Title] [nvarchar](30) NULL,
	Sales INT NULL,
)
insert into myEmployees values
('Nancy','Sales Representative',100),
('Andrew','Sales Manager',200),
('Janet','Sales Representative',300),
('Margaret','Sales Representative',400),
('Sandy',NULL,500)
檢查一下建立的資料
select * from  [dbo].[myEmployees]

image


使用下列語法建立資料

SELECT NAME+'/'+ Title from [myEmployees] 
查詢結果可發現第五筆資料應該要有內容但與NULL字串相加之後變成NULL了

image

使用下列語法再重新查一次

SET CONCAT_NULL_YIELDS_NULL OFF; 
SELECT NAME+'/'+ Title from [myEmployees]

image


其實資料庫預設連線屬性都是 SET CONCAT_NULL_YIELDS_NULL ON;
包含查詢工具SSMS的Advance 都是SET CONCAT_NULL_YIELDS_NULL ON
參考下圖:

image

因此,除非特別指定SET CONCAT_NULL_YIELDS_NULL ON ,否則透過t-sql處理都會有問題
建議欄位內容若為字串盡量不要存放null值,應改用空值才能避免此問題

事實上null值若用在where條件中做為比較值,也會比較麻煩

假設我需要列出所有Title非'Sales Manager'的員工資料
比較一下下列兩個查詢內容,結果都一樣只回傳三筆

SET CONCAT_NULL_YIELDS_NULL OFF;
SELECT * FROM [dbo].[myEmployees]
WHERE Title<>'Sales Manager'

SET CONCAT_NULL_YIELDS_NULL ON;
SELECT * FROM [dbo].[myEmployees]
WHERE Title<>'Sales Manager'
改用下列語法才能得到正確資料
SELECT * FROM [dbo].[myEmployees]
WHERE Title<>'Sales Manager' OR  Title IS NULL

image

arrow
arrow
    全站熱搜

    小草 發表在 痞客邦 留言(0) 人氣()