天天看點

PostgreSQL 自定義自動類型轉換(CAST)

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>