sql >> Databasteknik >  >> RDS >> Oracle

Åtgärda felet "ORA-01790:uttryck måste ha samma datatyp som motsvarande uttryck"

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.


  1. Förhindrar JDBC-specifikationen '?' från att användas som operator (utanför citattecken)?

  2. Undviker SQL-injektion utan parametrar

  3. Hur LAST_DAY() fungerar i MariaDB

  4. Lista över nummerformatselement i Oracle