1. ホーム
  2. postgresql

[解決済み] 未知語からテキストへの変換関数が見つかりません。

2023-07-13 06:26:52

質問

select文の1つで、以下のエラーが発生しました。

ERROR:  failed to find conversion function from unknown to text
********** Error **********
ERROR: failed to find conversion function from unknown to text
SQL state: XX000

これを修正するのは簡単で cast を使えば簡単に直りますが、なぜこのようなことが起こったのか、私にはよくわかりません。私は、2 つの単純なステートメントで私の混乱を説明します。

これはOKです。

select 'text'
union all
select 'text';

これはエラーを返します。

with t as (select 'text')    
select * from t
union all
select 'text'

簡単に直せると思っています。

with t as (select 'text'::text)    
select * from t
union all
select 'text'

なぜ2番目の例では変換に失敗するのでしょうか?私が理解していないロジックがあるのでしょうか、それともPostgreSQLの将来のバージョンで修正されるのでしょうか?

PostgreSQL 9.1.9

PostgreSQL 9.2.4でも同じ動作です( SQLフィドル )

どのように解決するのですか?

Postgresは、コンテキストから型付けされていない定数の型を検出できれば満足です。しかし、任意のコンテキストが不可能な場合、そして、クエリが単純なものよりも少し複雑な場合、この機構は失敗します。これらのルールはあらゆるSELECT句に特有のものであり、より厳しいものもあればそうでないものもあります。もし私が言えるとしたら、古いルーチンはより寛容で(Oracleとの互換性が高く、初心者への悪影響が少ないため)、最新のものはより寛容ではありません(型エラーへの安全性が高いため)。

テキスト定数のような未知のリテラル定数を扱おうとする提案もありましたが、より多くの理由で却下されました。ですから、私はこの分野での大きな変化は期待していません。この問題は通常、合成テストに関連しており、列の型から型を推測するような実際のクエリにはあまり関係しません。