実際、私が答えようとする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からの動作が変更されました。 unknownsSELECTに残っている または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のタイプになります。 。