全部產品
Search
文件中心

PolarDB:條件函數(CASE、COALESCE、NULLIF、NVL、NVL2、GREATEST、LEAST)

更新時間:Jul 06, 2024

下面介紹了在PolarDB PostgreSQL版(相容Oracle)中可使用的與SQL語言相容的條件運算式。

CASE

SQL語言的CASE運算式為一般條件運算式,類似於其它語言中的if/else語句:

CASE WHEN condition THEN result
   [ WHEN ... ]
   [ ELSE result ]
END

CASE子句可使用於任何有效運算式中。condition是一個返回BOOLEAN結果的運算式。如果結果為TRUE,那麼CASE運算式的值就是條件後面的result。如果結果為FALSE,那麼任何隨後的WHEN子句都會以相同的行為進行搜尋。如果沒有WHEN condition為TRUE, 那麼CASE運算式的值就是ELSE子句中的result。如果省略ELSE子句,且沒有任何匹配的條件,結果就為NULL空值。

SELECT * FROM test;

 a
---
 1
 2
 3
(3 rows)

SELECT a,
    CASE WHEN a=1 THEN 'one'
         WHEN a=2 THEN 'two'
         ELSE 'other'
    END
FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other
(3 rows)

所有result運算式的資料類型必須可轉換為單一的輸出類型。

下列“簡單” CASE運算式是上述一般形式的一個指定變數:

CASE expression
    WHEN value THEN result
  [ WHEN ... ]
  [ ELSE result ]
END

Expression將被計算並且和WHEN子句中所有指定的value進行比較,直到發現一個與之相等的結果。 如果沒有發現匹配的資訊,那麼將返回ELSE子句中的result(或一個空值)。

上述樣本可以用簡單CASE文法進行編寫:

SELECT a,
    CASE a WHEN 1 THEN 'one'
           WHEN 2 THEN 'two'
           ELSE 'other'
    END
FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other
(3 rows)

CASE運算式不評估任何不用於決定結果的子運算式。例如,下面的方法是一種可能會避免除以零的無效結果:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

COALESCE

函數COALESCE返回的是它第一個不是空值的參數。只有在所有參數都為空白值的情況下,才會返回空值。

COALESCE(value [, value2 ] ... )

當為了顯示或更進一步的計算而取回資料時,通常都會用預設值代替空值。例如:

SELECT COALESCE(description, short_description, '(none)') ...

像CASE運算式一樣,COALESCE不會評估任何不用於決定結果的參數。也就是說,第一個不允許為 NULL 的參數右側的參數將不被評估。SQL標準的函數提供類似於NVL和IFNULL的功能,這些功能可用於一些其它的資料庫系統中。

NULLIF

如果value1和value2相等,函數NULLIF返回空值,否則它返回value1。

NULLIF(valuel, value2)

這個函數做出運算操作用和上面給出的關於函數COALESCE的樣本正好相反:

SELECT NULLIF(value1, '(none)') ...

如果value1是(none),返回空值,否則返回參數value1的值。

NVL

函數NVL返回的是它第一個非空值的參數。函數NVL評估的是第一個運算式。如果這個運算式被評估為NULL,那麼函數NVL返回的則是第二個運算式。

NVL(exprl, expr2)

返回的類型和參數類型是一樣的。所有參數必須是相同的資料類型(或可以變為常用資料類型)。如果所有參數都為NULL,那麼函數NVL返回的則是NULL空值。

下列樣本為那些沒有傭金的員工計算了傭金。如果員工有傭金,那麼這個運算式返回的就是員工的傭金; 如果員工沒有傭金,(也就是說,員工的傭金為NULL),那麼這個運算式返回的就是傭金,金額為該員工薪水的10%。

bonus = NVL(emp.commission, emp.salary * .10)

NVL2

NVL2用於評估運算式,並返回第二個或第三個運算式,主要取決於第一個運算式的值。如果第一個運算式不是NULL,那麼NVL2返回的就是expr2的值;如果第一個運算式為NULL,那麼NVL2返回的則是expr3的值。

NVL2(expr1, expr2, expr3)

返回的類型和參數類型是一致的。所有參數必須是相同的資料類型(或可以變為常用資料類型)。

下列樣本計算了有傭金員工的傭金。如果指定的員工有傭金,那麼這個運算式所返回的傭金數額相當於員工傭金的110%。 如果這個員工沒有傭金(也就是說該員工的傭金為NULL),那麼這個運算式返回的則是0。

bonus = NVL2(emp.commission, emp.commission * 1-1, 0)

GREATEST和LEAST

GREATEST和LEAST函數用於從任意數量的運算式中查詢出最大或最小的數值。

GREATEST(value [, value2 ] ... )

LEAST(value [, value2 ] ... )

運算式必須都可以轉換成一個通用的資料類型,這個通用資料類型是結果的類型。而在列表中的空值是忽略的。只有所有的運算式計算值為空白的時候,最後結果才為空白值。

需要注意的函數GREATEST 和LEAST不在SQL標準中體現,而是一個當前普遍的擴充函數。