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.