実際、私が答えようとする3つの質問があります。
-
unknown
の目的は何ですか ?これは、SQLステートメントでNULLおよび文字列リテラルに最初に割り当てられたデータ型です。そのようなリテラルが割り当てられた場合、タイプ
text
すぐに、正しいタイプを推測するのは難しいでしょう。たとえば、
myfunc('hello')
が必要です。myfunc(character varying)
を呼び出す 、ただし、text
からキャストされた暗黙の型はありませんcharacter varying
(作成するとあいまいさが発生します)。 -
SELECT null
がなぜ タイプunknown
の列を返します ?従来の答えは、ユーザーがタイプを指定しなかったためです。
ただし、この動作には問題があります。たとえば、次のようなテーブルを作成する場合:
CREATE TABLE test AS SELECT 'hello';
タイプ
unknown
の列になってしまいます 、これは望ましくなく、さらに問題を引き起こします。タイプunknown
実際には、ユーザーに表示するのではなく、実装の詳細を表示する必要があります。したがって、
このコミット PostgreSQLv10からの動作が変更されました。 unknown
sSELECT
に残っている またはRETURNING
リストはtext
に強制されます 、およびタイプunknown
の列を使用してテーブルを作成することはできません 。 -
SELECT NULL UNION SELECT 42
が選ばれるのはなぜですか 動作しますが、SELECT NULL UNION SELECT NULL UNION SELECT 42
ではありません ?これは、型変換ルール によるものです。 。
UNION
は結合性のままなので、後者のクエリは次のように解釈されます(SELECT NULL UNION SELECT NULL) UNION SELECT 42;
これで最初の
UNION
データ型text
に解決されます ルール3のため:これにより、2番目の
UNION
のタイプを解決しようとしたときにエラーが発生します ルール4のため:一方、クエリでは
SELECT NULL UNION SELECT 42;
「NULL」のタイプは
unknown
、および「42」のタイプはinteger
(小数点のない数値リテラル用に選択されたタイプ)。ルール5
integer
であるため、ここでは適用されません。 そのカテゴリで推奨されるタイプではありません(oid
になります) およびdouble precision
)、ルール6が使用されます:これにより、
integer
のタイプになります。 。