Postgresql
為什麼在 PostgreSQL 上使用 SELECT DISTINCT 而不是 SELECT 時類型解析失敗?
這是一個最小的複制:
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 ALL
是unknown
:SELECT pg_typeof(NULL); pg_typeof ----------- unknown (1 row)
這得到解決
integer
。如果有,PostgreSQL 必須在前面
DISTINCT
解析類型:為了消除重複,它必須知道使用哪個相等運算符。NULL
缺少其他資訊,它選擇text
作為字元串類別的首選類型。然後您會收到錯誤,因為
integer
並且text
無法調和。該文件描述了相等運算符的類型選擇,如下所示:
如果任何輸入參數是
unknown
,請檢查其餘候選者在這些參數位置接受的類型類別。在每個職位上,string
如果有任何候選人接受該類別,請選擇該類別。(這種對字元串的偏見是適當的,因為未知類型的文字看起來像字元串。)