sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL:FEJL:operator findes ikke:heltal =tegnvarierende

Jeg tror, ​​det fortæller dig præcis, hvad der er galt. Du kan ikke sammenligne et heltal med en varchar. PostgreSQL er streng og udfører ingen magisk typecasting for dig. Jeg gætter på, at SQLServer udfører typecasting automagisk (hvilket er en dårlig ting).

Hvis du vil sammenligne disse to forskellige dyr, skal du caste det ene til det andet ved hjælp af casting-syntaksen :: .

Noget i denne retning:

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

Læg mærke til varchar typecasting på table1.col4.

Bemærk også, at typecasting muligvis kan gøre dit indeks på den kolonne ubrugelig og har en ydeevnestraf, hvilket er ret dårligt. En endnu bedre løsning ville være at se, om du permanent kan ændre en af ​​de to kolonnetyper, så den matcher den anden. Ændr bogstaveligt talt dit databasedesign.

Eller du kan oprette et indeks over de castede værdier ved at bruge en tilpasset, uforanderlig funktion som kaster værdierne på kolonnen. Men også dette kan vise sig at være suboptimalt (men bedre end live casting).




  1. Hvordan opretter man forbindelse til MySQL-server på en anden vært?

  2. AMD EPYC-processorer i virtuelle Azure-maskiner

  3. TILSYNLIGT DEADLOCK Oprettelse af nødtråde til ikke-tildelte afventende opgaver

  4. forvandle den distinkte værdi af kolonner til en række postgres