PostgreSQL: ERROR: Operator existiert nicht: Integer = Zeichen variierend

72

Hier versuche ich, eine Ansicht zu erstellen, wie unten im Beispiel gezeigt:

Beispiel:

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

Hinweis: Dieselbe Abfrage wurde auf dem SQL Server ausgeführt, es wird jedoch der obige Fehler in postgreSQL angezeigt.

Meem
quelle

Antworten:

77

Ich denke, es sagt dir genau, was los ist. Sie können eine Ganzzahl nicht mit einem Varchar vergleichen. PostgreSQL ist streng und führt keine magischen Typografien für Sie durch. Ich vermute, SQLServer typisiert automatisch (was eine schlechte Sache ist).

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

Etwas in diese 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 varchardie Typumwandlung in der Tabelle1.col4.

Beachten Sie auch, dass Typografie möglicherweise Ihren Index für diese Spalte unbrauchbar macht und eine Leistungsbeeinträchtigung zur Folge hat, die ziemlich schlecht 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 Ihr Datenbankdesign buchstäblich.

Sie können auch einen Index für die konvertierten Werte erstellen, indem Sie eine benutzerdefinierte, unveränderliche Funktion verwenden, die die Werte in die Spalte umwandelt. Aber auch dies kann sich als suboptimal erweisen (aber besser als Live-Casting).

Timusan
quelle
13
Um genau zu sein, hat PostgreSQL die "Magie" in 8.2 ausgeführt. In 8.3 wurde damit aufgehört.
Nux