

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# NVL2 函數
<a name="r_NVL2"></a>

根據指定的表達式評估為 NULL 還是 NOT NULL，傳回兩個值中的一個。

## 語法
<a name="r_NVL2-synopsis"></a>

```
NVL2 ( expression, not_null_return_value, null_return_value )
```

## 引數
<a name="r_NVL2-arguments"></a>

 *表達式*   
要評估 Null 狀態的表達式，例如欄名。

 *not\$1null\$1return\$1value*   
*expression* 評估為 NOT NULL 時所傳回的值。*not\$1null\$1return\$1value* 值的資料類型必須與 *expression* 相同，或可隱含地轉換為該資料類型。

 *null\$1return\$1value*   
*expression* 評估為 NULL 時所傳回的值。*null\$1return\$1value* 值的資料類型必須與 *expression* 相同，或可隱含地轉換為該資料類型。

## 傳回類型
<a name="r_NVL2-return-type"></a>

NVL2 傳回類型的決定方式如下：
+ 如果 *not\$1null\$1return\$1value* 或 *null\$1return\$1value* 為 Null，則傳回 not-null 表達式的資料類型。

如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 都不是 Null：
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有相同的資料類型，則傳回該資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的數值資料類型，則傳回最小可相容的數值資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的日期時間資料類型，則傳回時間戳記資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的字元資料類型，則傳回 *not\$1null\$1return\$1value* 的資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有混合的數值和非數值資料類型，則傳回 *not\$1null\$1return\$1value* 的資料類型。

**重要**  
前兩個案例中傳回 *not\$1null\$1return\$1value* 的資料類型，而 *null\$1return\$1value* 會隱含地轉換為該資料類型。如果資料類型不相容，函數會失敗。

## 使用須知
<a name="nvl2-usage-notes"></a>

當 *expression* 和 *search* 參數都為 null 時，可以用類似於 NVL2 的方式來使用 [DECODE 函數](r_DECODE_expression.md)。差別在於 DECODE 會同時傳回 *result* 參數的值和資料類型。反之，NVL2 會傳回 *not\$1null\$1return\$1value* 或 *null\$1return\$1value* 參數的值 (視函數選取何者而定)，但傳回值會有 *not\$1null\$1return\$1value* 的資料類型。

例如，假設 column1 是 NULL，下列查詢會傳回相同的值。不過，DECODE 傳回值的資料類型為 INTEGER，而 NVL2 傳回值的資料類型為 VARCHAR。

```
select decode(column1, null, 1234, '2345');
select nvl2(column1, '2345', 1234);
```

## 範例
<a name="r_NVL2-examples"></a>

下列範例修改一些範例資料，然後評估兩個欄位來提供使用者的適當聯絡資訊：

```
update users set email = null where firstname = 'Aphrodite' and lastname = 'Acevedo';

select (firstname + ' ' + lastname) as name, 
nvl2(email, email, phone) AS contact_info
from users 
where state = 'WA'
and lastname  like 'A%'
order by lastname, firstname;

name			     contact_info	
--------------------+-------------------------------------------
Aphrodite Acevedo	(906) 632-4407
Caldwell Acevedo 	Nunc.sollicitudin@Duisac.ca
Quinn Adams		  vel@adipiscingligulaAenean.com
Kamal Aguilar		quis@vulputaterisusa.com
Samson Alexander	 hendrerit.neque@indolorFusce.ca
Hall Alford		  ac.mattis@vitaediamProin.edu
Lane Allen		   et.netus@risusDonec.org
Xander Allison	   ac.facilisis.facilisis@Infaucibus.com
Amaya Alvarado	   dui.nec.tempus@eudui.edu
Vera Alvarez		 at.arcu.Vestibulum@pellentesque.edu
Yetta Anthony		enim.sit@risus.org
Violet Arnold		ad.litora@at.com
August Ashley		consectetuer.euismod@Phasellus.com
Karyn Austin		 ipsum.primis.in@Maurisblanditenim.org
Lucas Ayers		  at@elitpretiumet.com
```