Postgresql

預設允許的數據類型轉換矩陣

  • November 27, 2019

今天我想定義一個 uuid 的 value 00000000-0000-0000-0000-000000000000。作為一名 SQL Server 人員,我通常會

select cast(0x0 as uniqueidentifier);

…但我現在在 postgres 世界裡,所以我拿出了一個明智的…

select cast('\x00'::bytea as uuid);
ERROR:  cannot cast type bytea to uuid
LINE 1: select cast('\x00'::bytea as uuid);
              ^

該死!因此,我前往有關類型轉換的 postgres 文件,希望看到像這樣的文件來查看預設情況下我可以在哪些數據類型之間進行轉換,而無需創建顯式轉換。

sql-server-implicit-explicit-conversion-matrix

如果文件中確實存在這樣的圖表,則它被很好地隱藏了。Google在這方面同樣不是很有幫助。

對於 postgresql 中的預設允許類型轉換,是否有很好的文件參考?


需要明確的是,我實際上並不關心 uuid

您可以使用psql客戶端獲取列表

\dCS

這將顯示系統數據類型之間定義的所有轉換。

此外,所有類型都可以text使用類型輸入和輸出函式進行轉換。

作為對Laurenz 文章的補充…

文件

\dC[+] [ pattern ]

列出類型轉換。如果指定了模式,則僅列出源或目標類型與模式匹配的強制轉換。如果 + 附加到命令名稱,則列出每個對象及其相關描述。

\set ECHO_HIDDEN on顯示\dCS+正在執行…

SELECT pg_catalog.format_type(castsource, NULL) AS "Source type",
      pg_catalog.format_type(casttarget, NULL) AS "Target type",
      CASE WHEN c.castmethod = 'b' THEN '(binary coercible)'
           WHEN c.castmethod = 'i' THEN '(with inout)'
           ELSE p.proname
      END AS "Function",
      CASE WHEN c.castcontext = 'e' THEN 'no'
           WHEN c.castcontext = 'a' THEN 'in assignment'
           ELSE 'yes'
      END AS "Implicit?",
      d.description AS "Description"
FROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p
    ON c.castfunc = p.oid
    LEFT JOIN pg_catalog.pg_type ts
    ON c.castsource = ts.oid
    LEFT JOIN pg_catalog.pg_namespace ns
    ON ns.oid = ts.typnamespace
    LEFT JOIN pg_catalog.pg_type tt
    ON c.casttarget = tt.oid
    LEFT JOIN pg_catalog.pg_namespace nt
    ON nt.oid = tt.typnamespace
    LEFT JOIN pg_catalog.pg_description d
    ON d.classoid = c.tableoid AND d.objoid = c.oid AND d.objsubid = 0
WHERE ( (true  AND pg_catalog.pg_type_is_visible(ts.oid)
) OR (true  AND pg_catalog.pg_type_is_visible(tt.oid)
) )
ORDER BY 1, 2;

…這為我們指出了一些更有趣的文件頁面。

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