Sql Server數(shù)據(jù)庫(kù)中isnull、iif、case when三種方式的用法和空值判斷
前言
有時(shí)候數(shù)據(jù)庫(kù)你接觸多了,就會(huì)知道一些技巧,說(shuō)實(shí)在有時(shí)候博主沒(méi)有接觸到,我可能還是會(huì)用普通方式去判斷,這樣就會(huì)存在漏數(shù)據(jù)的情況。
所以,平時(shí)去積累一些技巧還是非常有必要的。
ISNULL用法
在 SQL Server 中,ISNULL 函數(shù)只接受兩個(gè)參數(shù),不支持三個(gè)參數(shù)的情況。
博主剛開(kāi)始是這么用的 ISNULL(t11.ItemCode,'Y','N') ,這種寫(xiě)法是錯(cuò)誤的。
ISNULL 函數(shù)的正確語(yǔ)法是:
ISNULL(check_expression, replacement_value)
case when用法
如果需要實(shí)現(xiàn)類(lèi)似三個(gè)參數(shù)的功能(當(dāng)字段為 NULL 時(shí)返回 ‘Y’,否則返回 ‘N’),可以使用 CASE WHEN 表達(dá)式:
CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END
iif
或者使用更簡(jiǎn)潔的 IIF 函數(shù)(SQL Server 2012 及以上版本支持):
IIF(t11.ItemCode IS NULL, 'Y', 'N')
查詢(xún)小技巧
技巧一
使用 CONCAT 安全地拼接字符串
問(wèn)題: 傳統(tǒng)的用加號(hào) + 拼接字符串時(shí),如果任何一個(gè)字段為 NULL,整個(gè)結(jié)果都會(huì)變成 NULL。
舊方法(有風(fēng)險(xiǎn)):
SELECT FirstName + ' ' + LastName AS FullName FROM Employees; -- 如果 FirstName 或 LastName 為 NULL,F(xiàn)ullName 就會(huì)顯示為 NULL
小技巧(使用 CONCAT):
SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;
好處:
CONCAT函數(shù)會(huì)自動(dòng)將NULL值視為空字符串''來(lái)處理。- 即使
FirstName或LastName為 NULL,其他部分依然會(huì)正常拼接,最終結(jié)果不會(huì)是 NULL。 - 代碼更簡(jiǎn)潔易讀。
技巧二
使用 EXISTS 代替 IN 來(lái)檢查存在性
問(wèn)題: 當(dāng)使用 IN 子查詢(xún)時(shí),數(shù)據(jù)庫(kù)需要先執(zhí)行整個(gè)子查詢(xún),返回所有結(jié)果集,然后再進(jìn)行主查詢(xún)和子查詢(xún)結(jié)果的匹配,如果子查詢(xún)結(jié)果集很大,性能會(huì)較差。
舊方法(可能低效):
SELECT *
FROM Customers
WHERE CustomerID IN (
SELECT DISTINCT CustomerID
FROM Orders
WHERE OrderDate > '2023-01-01'
);
小技巧(使用 EXISTS):
SELECT *
FROM Customers c
WHERE EXISTS (
SELECT 1
FROM Orders o
WHERE o.CustomerID = c.CustomerID
AND o.OrderDate > '2023-01-01'
);
好處:
- 性能更高:
EXISTS是一種關(guān)聯(lián)子查詢(xún),一旦找到一條滿(mǎn)足條件的記錄就會(huì)立即返回True并停止搜索,避免了處理整個(gè)子查詢(xún)結(jié)果集。 - 語(yǔ)義更清晰:
EXISTS直接表達(dá)了“是否存在”的邏輯意圖。 - 在子查詢(xún)結(jié)果集很大時(shí),性能提升尤為明顯。
這兩個(gè)技巧一個(gè)側(cè)重于數(shù)據(jù)的可靠性和整潔性,另一個(gè)側(cè)重于查詢(xún)的性能優(yōu)化,都是日常開(kāi)發(fā)中非常實(shí)用的“利器”。
到此這篇關(guān)于Sql Server數(shù)據(jù)庫(kù)中isnull、iif、case when三種方式的用法和空值判斷的文章就介紹到這了,更多相關(guān)sqlserver isnull、iif、case when內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)庫(kù)SQL語(yǔ)句優(yōu)化總結(jié)(收藏)
網(wǎng)上關(guān)于SQL優(yōu)化的教程很多,但是比較雜亂。近日有空整理了一下,寫(xiě)出來(lái)跟大家分享一下,感興趣的朋友參考下2017-03-03
SQL Server 創(chuàng)建約束圖解(唯一 主鍵)
SQLServer中有五種約束,Primary Key約束、Foreign Key約束、Unique約束、Default約束和Check約束,今天使用SQL Server2008來(lái)演示下這幾種約束的創(chuàng)建和使用的方法2016-07-07
SQLServer中NEWID()函數(shù)用于生成一個(gè)唯一的標(biāo)識(shí)符的方法實(shí)踐
NEWID函數(shù)用于生成一個(gè)唯一的標(biāo)識(shí)符,本文主要介紹了SQLServer中NEWID()函數(shù)用于生成一個(gè)唯一的標(biāo)識(shí)符的方法實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
mssql和sqlite中關(guān)于if not exists 的寫(xiě)法
本文介紹下sql server查詢(xún)中,有關(guān)if exists與if not exists關(guān)鍵字的用法,有需要的朋友參考下2014-04-04
三種實(shí)現(xiàn)方法實(shí)現(xiàn)數(shù)據(jù)表中遍歷尋找子節(jié)點(diǎn)
數(shù)據(jù)表中遍歷尋找子節(jié)點(diǎn)的三種實(shí)現(xiàn)方法:2008-05-05
如何創(chuàng)建支持FILESTREAM的數(shù)據(jù)庫(kù)示例探討
FILESTREAM使用一種特殊類(lèi)型的文件組,因此在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),必須至少為一個(gè)文件組指定 CONTAINS FILESTREAM 子句接下來(lái)為你詳細(xì)介紹下如何創(chuàng)建支持 FILESTREAM 的數(shù)據(jù)庫(kù)2013-03-03
SQLServer創(chuàng)建索引的5種方法小結(jié)
本文主要介紹了SQLServer創(chuàng)建索引的5種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
淺述SQL Server的語(yǔ)句類(lèi)別 數(shù)據(jù)庫(kù)范式 系統(tǒng)數(shù)據(jù)庫(kù)組成
本文著重講解了SQL語(yǔ)句的組成以及數(shù)據(jù)庫(kù)的三個(gè)范式,對(duì)系統(tǒng)數(shù)據(jù)庫(kù)的組成進(jìn)行簡(jiǎn)短的介紹。有興趣的朋友可以看下2016-12-12

