2013-08-06 12 views
40

をテキストに、未知からの変換機能が見つかりませんでした:は私のselect文、私は次のエラーを持っているのでは

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つの簡単なステートメントで私の混乱を払拭します。

この1つは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 Fiddle)に同じ挙動

答えて

36

Postgresは、満足しています。しかし、どんなコンテキストも不可能な場合や、クエリがほんの少し複雑な場合、このメカニズムは失敗します。これらのルールはSELECT句に固有のルールであり、厳格なルールもあれば厳格なルールもあります。私が言うことができれば、古いルーチンはより耐性があります(Oracleとの高い互換性と初心者への負の影響が少ないため)。

テキスト定数のような未知のリテラル定数で作業しようとする提案がいくつかありましたが、それ以上の理由で拒否されました。だから私はこの分野で大きな変化は期待していない。この問題は、通常、合成テストに関係します。実際のクエリではなく、列の型から型が導出されます。

+2

です。私はこの問題を現実にはかなり頻繁に直面しています。私たちは、analytics/bi/dataマイニングにPostgreSQLを使用しており、タイプのない定数の和集合が一般的です。しかし、私が言ったように、キャストするのは簡単です。 –

+1

なぜ '1 :: int'のような数値リテラルをキャストしなければならないのですか? –

+0

@IainElder - 数値型はより小さいクラスです - 任意のリテラル定数( "不明"という名前の)は暗黙的にどの型にもキャストできます - sin( '2.34')は機能していますが、 –

関連する問題