COALESCE() 函數接受一系列運算式,回傳第一個非 NULL 的值;若所有運算式皆為 NULL,則回傳 NULL。這特性讓它在處理「可選欄位組合」、「多來源資料取捨」、「動態計算」等情境極為實用。以下透過兩個實戰案例展示其靈活用法。
假設 Persons 表有 FirstName、MiddleName、LastName 三欄,資料如下:
SELECT FirstName + ' ' + COALESCE(MiddleName, '') + ' ' + COALESCE(LastName, '')
FROM Persons;
但這會導致 James Bond 變成 James Bond(兩個空格),因為 MiddleName 為 NULL 時,'' + ' ' + '' 仍產生一個空格。
CREATE FUNCTION dbo.WholeName
(
@first NVARCHAR(50),
@middle NVARCHAR(50),
@last NVARCHAR(50)
)
RETURNS NVARCHAR(150)
AS
BEGIN
DECLARE @Result NVARCHAR(150);
SELECT @Result = LTRIM(@first + ' ' + COALESCE(@middle, '') + ' ') + COALESCE(@last, '');
RETURN @Result;
END;
呼叫範例:
SELECT dbo.WholeName('James', NULL, 'Bond') -- James Bond
UNION SELECT dbo.WholeName('Cher', NULL, NULL) -- Cher
UNION SELECT dbo.WholeName('John', 'F.', 'Kennedy'); -- John F. Kennedy
員工薪資結構不一:時薪、計件、週薪+提成。建立示範表 PayDay:
EmployeeID | HourlyWage | HoursPerWeek | AmountPerPiece | PiecesThisWeek | WeeklySalary | CommissionThisWeek
1 | 18.00 | 40 | NULL | NULL | NULL | NULL
2 | NULL | NULL | 4.00 | 400 | NULL | NULL
3 | NULL | NULL | NULL | NULL | 800.00 | NULL
4 | NULL | NULL | NULL | NULL | 500.00 | 600
SELECT EmployeeID,
COALESCE(HourlyWage * HoursPerWeek, 0) +
COALESCE(AmountPerPiece * PiecesThisWeek, 0) +
COALESCE(WeeklySalary + CommissionThisWeek, 0) AS Payment
FROM PayDay;
結果:
EmployeeID | Payment
1 | 720.00
2 | 1600.00
3 | 800.00
4 | 1100.00
ALTER TABLE PayDay
ADD Payment AS
COALESCE(HourlyWage * HoursPerWeek, 0) +
COALESCE(AmountPerPiece * PiecesThisWeek, 0) +
COALESCE(WeeklySalary + CommissionThisWeek, 0);
之後直接 SELECT * FROM PayDay 即可看到即時計算的 Payment,無需在每個查詢重複邏輯,且效能優於視圖或函數調用。
LTRIM/RTRIM 可解決字串拼接的空格殘留問題。