PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:FEHLER:Operator existiert nicht:Ganzzahl =Zeichen variieren

Ich denke, es sagt Ihnen genau, was falsch ist. Sie können eine Ganzzahl nicht mit einem Varchar vergleichen. PostgreSQL ist streng und führt keine magische Typumwandlung für Sie durch. Ich vermute, dass SQLServer die Typumwandlung automatisch durchführt (was eine schlechte Sache ist).

Wenn Sie diese beiden unterschiedlichen Bestien vergleichen möchten, müssen Sie sie mithilfe der Casting-Syntax :: ineinander umwandeln .

Etwas in dieser Richtung:

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 */
....;

Beachten Sie den varchar Typumwandlung auf table1.col4.

Beachten Sie auch, dass die Typumwandlung möglicherweise Ihren Index in dieser Spalte unbrauchbar macht und eine Leistungseinbuße hat, was ziemlich schlimm ist. Eine noch bessere Lösung wäre zu sehen, ob Sie einen der beiden Spaltentypen dauerhaft ändern können, um ihn an den anderen anzupassen. Ändern Sie buchstäblich Ihr Datenbankdesign.

Oder Sie könnten einen Index für die umgewandelten Werte erstellen, indem Sie ein benutzerdefiniertes, unveränderliches verwenden Funktion, die die Werte in die Spalte wirft. Aber auch dies kann sich als suboptimal erweisen (aber besser als Live-Casting).