web-dev-qa-db-ja.com

PostgreSQL:エラー:演算子が存在しません:整数=可変文字

ここでは、下の例に示すようにビューを作成しようとしています:

例:

 create view view1
 as 
 select table1.col1,table2.col1,table3.col3
 from table1 
 inner join
 table2 
 inner join 
 table3
 on 
 table1.col4 = table2.col5 
 /* Here col4 of table1 is of "integer" type and col5 of table2 is of type "varchar" */
 /* ERROR: operator does not exist: integer = character varying */
 ....;

注:SQLサーバーで同じクエリを実行しましたが、postgreSQLで上記のエラーが発生しました。

46
Meem

何が間違っているのかを正確に伝えていると思います。整数をvarcharと比較することはできません。 PostgreSQLは厳密であり、魔法の型キャストを行いません。 SQLServerは自動的に型キャストを行うと思います(これは悪いことです)。

これら2つの異なる獣を比較したい場合、キャスト構文::を使用して、一方を他方にキャストする必要があります。

これらの線に沿って何か:

create view view1
as 
select table1.col1,table2.col1,table3.col3
from table1 
inner join
table2 
inner join 
table3
on 
table1.col4::varchar = table2.col5
/* Here col4 of table1 is of "integer" type and col5 of table2 is of type "varchar" */
/* ERROR: operator does not exist: integer = character varying */
....;

Table1.col4のvarchar型キャストに注意してください。

また、型キャストを行うと、その列のインデックスが使用できなくなり、パフォーマンスが低下する可能性があることに注意してください。さらに良い解決策は、2つの列タイプの一方を他方に合わせて永続的に変更できるかどうかを確認することです。データベース設計をリテラルに変更します。

または、列に値をキャストするカスタムのimmutable関数を使用して、キャストされた値にインデックスを作成できます。ただし、これも最適ではない場合があります(ただし、ライブキャスティングよりも優れています)。

51
Timusan