Pokud se vám v Oracle Database zobrazuje chyba „ORA-01790:výraz musí mít stejný datový typ jako odpovídající výraz“, je to pravděpodobně proto, že používáte operátor, jako je UNION
, INTERSECT
nebo EXCEPT
spustit složený dotaz, ale sloupce vrácené každým dotazem používají různé skupiny datových typů.
Chcete-li tento problém vyřešit, musíte zajistit, aby každý sloupec vrácený druhým dotazem používal stejnou skupinu datových typů jako odpovídající sloupec v prvním dotazu.
Příklad chyby
Zde je příklad kódu, který způsobuje tuto chybu:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Výsledek:
ORA-01790: expression must have same datatype as corresponding expression
Problém je v tom, že se snažím zkombinovat TeacherName
v prvním dotazu s StudentId
sloupec ve druhém dotazu.
V mém případě TeacherName
sloupec je varchar(50)
sloupec, ale StudentId
sloupec je int
sloupec. To způsobí, že dojde k chybě.
Řešení 1
Prvním (a pravděpodobně nejčastějším) řešením výše uvedené chyby je zajistit, abychom v každém dotazu měli správný sloupec/y.
V mém případě se zdá zcela zřejmé, že jsem prošel špatnými sloupci. Proto mohu výše uvedený dotaz upravit následovně:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Výsledek:
TEACHERNAME |
---|
Ben |
Bill |
Cathy |
Ein |
Faye |
Jet |
Spike |
Warren |
Nebo bych mohl udělat následující:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Výsledek:
ID UČITELE | TEACHERNAME |
---|---|
1 | Faye |
1 | Warren |
2 | Ben |
2 | Jet |
3 | Cathy |
3 | Spike |
4 | Cathy |
4 | Ein |
5 | Bill |
5 | Warren |
6 | Bill |
V obou případech se typy sloupců vrácené druhým dotazem shodovaly s typy vrácenými prvním dotazem.
Řešení 2
V některých případech můžete zjistit, že máte správné sloupce, ale jejich typy se neshodují. V takových případech může být nutné převést jeden ze sloupců na jiný datový typ.
Pomocí našeho příkladu bychom mohli udělat toto:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Výsledek:
TEACHERNAME |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Ben |
Bill |
Cathy |
Warren |
Toto pravděpodobně není nejlepší příklad, protože kombinuje jména s ID, ale jsem si jistý, že to pochopíte. Chybě se nám podařilo vyhnout pomocí TO_CHAR(number)
funkci pro převod StudentId
sloupec na char
typ.