sql >> Databáze >  >> RDS >> Oracle

Oprava chyby „ORA-01790:výraz musí mít stejný datový typ jako odpovídající výraz“

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.


  1. Připojení .NET na Linuxu ke zdroji dat ODBC

  2. Funkce TO_TIMESTAMP_TZ() v Oracle

  3. Podobnosti a rozdíly mezi funkcemi RANK, DENSE_RANK a ROW_NUMBER

  4. Oracle 12.2.0.1 přichází v roce 2016