天天看點

PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 10 章 類型轉換_10.5. UNION、CASE和相關結構

10.5. 

UNION

CASE

和相關結構

SQL 

UNION

結構必須使可能不相似的類型比對成為一個單一的結果集。該決定算法被獨立地應用到一個聯合查詢的每個輸出列。 

INTERSECT

EXCEPT

采用和

UNION

相同的方法來決定不相似的類型。

CASE

ARRAY

VALUES

GREATEST

LEAST

結構使用相同的算法來使它們的組成表達式比對并選擇一種結果資料類型。

UNION

CASE

和相關結構的類型決定

  1. 如果所有的輸入為相同類型,并且不是

    unknown

    ,那麼就決定是該類型。
  2. 如果任何輸入是一種域類型,在所有後續步驟中都把它當做 該域的基類型。  [9]
  3. 如果所有的輸入為

    unknown

    類型,則決定為

    text

    (字元串分類的首選類型)類型。 否則,為了其餘規則,

    unknown

    輸入被忽略。
  4. 如果非未知輸入不全是相同的類型分類,則失敗。
  5. 如果有的話,選擇第一個在其分類中作為首選類型的非未知輸入類型。
  6. 否則,選擇最後的非未知輸入類型,它允許所有在前面的非未知輸入被隐式地轉換為它(總有這樣的一種類型,因為至少在清單中的第一個類型必須滿足這個條件)。
  7. 轉換所有的輸入為標明的類型。如果沒有一個從給定輸入到標明類型的轉換将會失敗。

下面是一些例子。

例 10.9. 聯合中未指定類型的類型決定

SELECT text 'a' AS "text" UNION SELECT 'b';

 text
------
 a
 b
(2 rows)      

這裡,未知類型文字

'b'

将被決定為類型

text

例 10.10. 簡單聯合中的類型決定

SELECT 1.2 AS "numeric" UNION SELECT 1;

 numeric
---------
       1
     1.2
(2 rows)      

文字

1.2

numeric

類型,且

integer

1

可以被隐式地造型為

numeric

,是以使用

numeric

類型。

例 10.11. 可換位聯合中的類型決定

SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);

 real
------
    1
  2.2
(2 rows)      

這裡,由于類型

real

被能被隐式地造型為

integer

,而

integer

real

,聯合結果類型被決定為

real

[9] 

多少有些類似于對待用于操作符和函數的域輸入的方式,這種行為允許 一種域類型能通過一個

UNION

或相似的結構保留下來, 隻要使用者小心地確定所有的輸入都是(顯式地或隐式地)準确類型。否 則會優先選擇該域的基類型。

本文轉自PostgreSQL中文社群,原文連結:

UNION

CASE

繼續閱讀