ここでは、下の例に示すようにビューを作成しようとしています:
例:
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で上記のエラーが発生しました。
何が間違っているのかを正確に伝えていると思います。整数を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関数を使用して、キャストされた値にインデックスを作成できます。ただし、これも最適ではない場合があります(ただし、ライブキャスティングよりも優れています)。