本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
NVL 和 COALESCE函數
傳回一系列運算式中不為 null 的第一個運算式的值。找到非 Null 值時,就不會評估清單中剩餘的運算式。
NVL 與 相同COALESCE。它們是同義詞。本主題說明語法,並包含兩者的範例。
語法
NVL( expression, expression, ... )
的語法COALESCE相同:
COALESCE( expression, expression, ... )
如果所有表達式都是 Null,則結果為 Null。
當您想要在主要值遺失或為 null 時傳回次要值,這些函數非常有用。例如,查詢可能會傳回三個可用電話號碼中的第一個:行動電話號碼、住家或公司。函數中運算式的順序決定評估的順序。
引數
- 運算式
-
要評估 Null 狀態的表達式,例如欄名。
傳回類型
Amazon Redshift 會根據輸入運算式判斷傳回值的資料類型。如果輸入運算式的資料類型沒有一般類型,則會傳回錯誤。
範例
如果清單包含整數運算式,該函數傳回一個整數。
SELECT COALESCE(NULL, 12, NULL);
coalesce -------------- 12
此範例與上一個範例相同,除了使用 之外NVL, 會傳回相同的結果。
SELECT NVL(NULL, 12, NULL);
coalesce -------------- 12
下列範例會傳回字串類型。
SELECT COALESCE(NULL, 'Amazon Redshift', NULL);
coalesce -------------- Amazon Redshift
下列範例會導致錯誤,因為運算式清單中的資料類型不同。在這種情況下,清單中同時存在字串類型和數字類型。
SELECT COALESCE(NULL, 'Amazon Redshift', 12);
ERROR: invalid input syntax for integer: "Amazon Redshift"
在此範例中,您可以建立包含 START_DATE 和 END_DATE 資料欄的資料表、插入包含 null 值的資料列,然後將NVL運算式套用至兩個資料欄。
create table datetable (start_date date, end_date date); insert into datetable values ('2008-06-01','2008-12-31'); insert into datetable values (null,'2008-12-31'); insert into datetable values ('2008-12-31',null);
select nvl(start_date, end_date) from datetable order by 1;
coalesce ------------ 2008-06-01 2008-12-31 2008-12-31
NVL 運算式的預設資料欄名稱為 COALESCE。下列查詢會傳回相同的結果:
select coalesce(start_date, end_date) from datetable order by 1;
對於下列範例查詢,您可以建立包含飯店預訂範例資訊的表格,並插入數列。有些記錄包含 null 值。
create table booking_info (booking_id int, booking_code character(8), check_in date, check_out date, funds_collected numeric(12,2));
插入下列範例資料。有些記錄沒有 check_out
日期或 funds_collected
金額。
insert into booking_info values (1, 'OCEAN_WV', '2023-02-01','2023-02-03',100.00); insert into booking_info values (2, 'OCEAN_WV', '2023-04-22','2023-04-26',120.00); insert into booking_info values (3, 'DSRT_SUN', '2023-03-13','2023-03-16',125.00); insert into booking_info values (4, 'DSRT_SUN', '2023-06-01','2023-06-03',140.00); insert into booking_info values (5, 'DSRT_SUN', '2023-07-10',null,null); insert into booking_info values (6, 'OCEAN_WV', '2023-08-15',null,null);
下列查詢會傳回日期清單。如果 check_out
日期不可用,它會列出 check_in
日期。
select coalesce(check_out, check_in) from booking_info order by booking_id;
結果如下。請注意,最後兩則記錄顯示 check_in
日期。
coalesce ------------ 2023-02-03 2023-04-26 2023-03-16 2023-06-03 2023-07-10 2023-08-15
如果您預期查詢會傳回特定函數或資料欄的 null 值,您可以使用NVL運算式將 null 取代為其他一些值。例如,彙總函數,例如 SUM,會在沒有要評估的資料列時傳回 null 值,而不是零。您可以使用 NVL運算式,將這些 null 值取代為 700.0
。加總 funds_collected
的結果不是 485
而是 1885
,因為兩個有 null 的列被替換為 700
。
select sum(nvl(funds_collected, 700.0)) as sumresult from booking_info;
sumresult ------ 1885