Om du får felet "ORA-01790:uttryck måste ha samma datatyp som motsvarande uttryck" i Oracle Database, beror det förmodligen på att du använder en operator som UNION
, INTERSECT
, eller EXCEPT
för att köra en sammansatt fråga, men kolumnerna som returneras av varje fråga använder olika datatypgrupper.
För att åtgärda det här problemet måste du se till att varje kolumn som returneras av den andra frågan använder samma datatypgrupp som motsvarande kolumn i den första frågan.
Exempel på fel
Här är ett exempel på kod som ger det här felet:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Resultat:
ORA-01790: expression must have same datatype as corresponding expression
Problemet här är att jag försöker kombinera TeacherName
kolumnen i den första frågan, med StudentId
kolumnen i den andra frågan.
I mitt fall, TeacherName
kolumnen är en varchar(50)
kolumnen men StudentId
kolumnen är en int
kolumn. Detta gör att felet uppstår.
Lösning 1
Den första (och förmodligen vanligaste) lösningen på ovanstående fel är att se till att vi har rätt kolumn/er i varje fråga.
I mitt fall verkar det ganska uppenbart att jag passerade fel kolumner. Därför kan jag ändra ovanstående fråga enligt följande:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Resultat:
LÄRARNAMN |
---|
Ben |
Bill |
Cathy |
Ein |
Faye |
Jet |
Spike |
Warren |
Eller så kan jag göra följande:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Resultat:
LÄRARID | LÄRARNAMN |
---|---|
1 | Faye |
1 | Warren |
2 | Ben |
2 | Jet |
3 | Cathy |
3 | Spike |
4 | Cathy |
4 | Ein |
5 | Fakta |
5 | Warren |
6 | Fakta |
I båda fallen matchade kolumntyperna som returnerades av den andra frågan de typer som returnerades av den första frågan.
Lösning 2
I vissa fall kan du upptäcka att du har rätt kolumner, men deras typer stämmer inte överens. I sådana fall kan du behöva konvertera en av kolumnerna till en annan datatyp.
Med vårt exempel skulle vi kunna göra detta:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Resultat:
LÄRARNAMN |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Ben |
Bill |
Cathy |
Warren |
Det här är förmodligen inte det bästa exemplet, eftersom det kombinerar namn med ID, men jag är säker på att du förstår bilden. Vi kunde undvika felet genom att använda TO_CHAR(number)
funktion för att konvertera StudentId
kolumn till en char
typ.