Postgresql

為什麼在 PostgreSQL 上使用 SELECT DISTINCT 而不是 SELECT 時類型解析失敗?

  • August 28, 2020

這是一個最小的複制:

SELECT 1
UNION ALL
SELECT DISTINCT NULL

失敗:

UNION types numeric and text cannot be matched

根據關於 UNION、CASE 和相關結構的類型解析的 PostgreSQL 文件以及後面關於SELECT 輸出列的章節,null應該從前面的選擇中派生出的類型。

事實上,如果我刪除DISTINCT

SELECT 1
UNION ALL
SELECT NULL

為什麼DISTINCT修飾符會干擾類型解析?

沒有DISTINCT, 的第二部分的類型UNION ALLunknown:

SELECT pg_typeof(NULL);

pg_typeof 
-----------
unknown
(1 row)

這得到解決integer

如果有,PostgreSQL 必須在前面DISTINCT解析類型:為了消除重複,它必須知道使用哪個相等運算符。NULL缺少其他資訊,它選擇text作為字元串類別的首選類型。

然後您會收到錯誤,因為integer並且text無法調和。

該文件描述了相等運算符的類型選擇,如下所示:

如果任何輸入參數是unknown,請檢查其餘候選者在這些參數位置接受的類型類別。在每個職位上,string如果有任何候選人接受該類別,請選擇該類別。(這種對字元串的偏見是適當的,因為未知類型的文字看起來像字元串。)

引用自:https://dba.stackexchange.com/questions/274538