1. ホーム
  2. postgresql

[解決済み] PostgreSQL。ERROR: 演算子が存在しない: integer = character varying

2023-01-30 01:24:48

質問

ここでは、例として以下のようなビューを作成しようとしています。

例です。

 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 Serverで実行されましたが、postgreSQLで上記のエラーが発生しました。

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

何が間違っているのかを正確に教えてくれていると思います。integerと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 */
....;

注目すべきは varchar のタイプキャストに注目してください。

また、タイプキャストはおそらくそのカラムのインデックスを使用不能にするかもしれず、パフォーマンス上のペナルティがあり、これはかなり悪いことに注意してください。さらに良い解決策は、2 つの列型のうち 1 つを永久に変更して、もう 1 つの列型と一致させることができるかどうかを確認することです。文字通り、データベースの設計を変更するのです。

または、カスタム.NET を使用して、キャストされた値にインデックスを作成することもできます。 不変の 関数を使用して、キャストされた値のインデックスを作成することもできます。しかし、これも最適とは言えないかもしれません (しかし、ライブキャストよりはましです)。