これは、関数型の解決のルールによって決定されます 。マニュアルの詳細な説明。関連:
- Postgresで関数のオーバーロードを無効にする方法はありますか
明示的な型キャストのないNULLは、型「不明」として始まります:
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
実際、 Postgres 9.3と9.4で異なる結果を見つけるために、私は疑わしくなり、簡単なテストを実行しました。 varchar
integer
で選択されます (奇妙な あなたの発見と矛盾します):
SQLフィドル。
それに応じたルールはリストのポイント4eだと思います(以前のポイントはどれも一致を決定しません):
候補者がそのカテゴリを受け入れる場合は、各位置で文字列カテゴリを選択します。 (不明なタイプのリテラルは文字列のように見えるため、この文字列へのバイアスは適切です。)
入力タイプがtext
の別の関数を追加した場合 オーバーロードされたミックスに、text
varchar
で選択されます 。
個人的にはほとんどの場合 text
を使用する varchar
の代わりに 。バイナリ互換でありながら(ほとんど同じではありませんが)、text
あらゆる点でPostgresの中心に近いです。
私はそれをバイオリンに追加しました。また、Postgresが決定できず、タントラムを投げる別の例も追加しました。
特定の関数を選択したい場合は、明示的な型キャストを追加します(これがここに行く方法です!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;