PostgreSQL , cast
PostgreSQL是一個強類型資料庫,是以你輸入的變量、常量是什麼類型,是強綁定的,例如
在調用操作符時,需要通過操作符邊上的資料類型,選擇對應的操作符。
在調用函數時,需要根據輸入的類型,選擇對應的函數。
如果類型不比對,就會報操作符不存在,或者函數不存在的錯誤。
那麼使用起來是不是很不友善呢?
PostgreSQL開放了類型轉換的接口,同時也内置了很多的自動類型轉換。來簡化操作。
檢視目前已有的類型轉換:
如果你發現有些類型轉換沒有内置,怎麼辦呢?我們可以自定義轉換。
當然你也可以使用這種文法,對類型進行強制轉換:
自定義CAST的文法如下:
解釋:
1、WITH FUNCTION,表示轉換需要用到什麼函數。
2、WITHOUT FUNCTION,表示被轉換的兩個類型,在資料庫的存儲中一緻,即實體存儲一緻。例如text和varchar的實體存儲一緻。不需要轉換函數。
3、WITH INOUT,表示使用内置的IO函數進行轉換。每一種類型,都有INPUT 和OUTPUT函數。使用這種方法,好處是不需要重新寫轉換函數。
除非有特殊需求,我們建議直接使用IO函數來進行轉換。
4、AS ASSIGNMENT,表示在指派時,自動對類型進行轉換。例如字段類型為TEXT,輸入的類型為INT,那麼可以建立一個 cast(int as text) as ASSIGNMENT。
5、AS IMPLICIT,表示在表達式中,或者在指派操作中,都對類型進行自動轉換。(包含了AS ASSIGNMENT,它隻對指派進行轉換)
6、注意,AS IMPLICIT需要謹慎使用,為什麼呢?因為操作符會涉及到多個算子,如果有多個轉換,目前資料庫并不知道應該選擇哪個?
是以,建議謹慎使用AS IMPLICIT。建議使用AS IMPLICIT的CAST應該是非失真轉換轉換,例如從INT轉換為TEXT,或者int轉換為numeric。
而失真轉換,不建議使用as implicit,例如numeric轉換為int。
不能嵌套轉換。例子
1、将text轉換為date
錯誤方法
嵌套轉換後出現死循環
正确方法
我們還可以直接使用IO函數來轉換:
<a href="https://www.postgresql.org/docs/10/static/sql-createcast.html">https://www.postgresql.org/docs/10/static/sql-createcast.html</a>