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)類似三個(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')
查詢小技巧
技巧一
使用 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;
好處:
技巧二
使用 EXISTS
代替 IN
來(lái)檢查存在性
問(wèn)題: 當(dāng)使用 IN
子查詢時(shí),數(shù)據(jù)庫(kù)需要先執(zhí)行整個(gè)子查詢,返回所有結(jié)果集,然后再進(jìn)行主查詢和子查詢結(jié)果的匹配,如果子查詢結(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)子查詢,一旦找到一條滿足條件的記錄就會(huì)立即返回 True
并停止搜索,避免了處理整個(gè)子查詢結(jié)果集。
語(yǔ)義更清晰:EXISTS
直接表達(dá)了“是否存在”的邏輯意圖。
在子查詢結(jié)果集很大時(shí),性能提升尤為明顯。
這兩個(gè)技巧一個(gè)側(cè)重于數(shù)據(jù)的可靠性和整潔性,另一個(gè)側(cè)重于查詢的性能優(yōu)化,都是日常開(kāi)發(fā)中非常實(shí)用的“利器”。
參考文章:原文鏈接?
?
該文章在 2025/9/30 16:10:01 編輯過(guò)