Ако получавате грешката „ORA-01790:изразът трябва да има същия тип данни като съответния израз“ в Oracle Database, това вероятно е защото използвате оператор като UNION
, INTERSECT
, или EXCEPT
за да изпълните съставна заявка, но колоните, върнати от всяка заявка, използват различни групи от типове данни.
За да отстраните този проблем, ще трябва да се уверите, че всяка колона, върната от втората заявка, използва същата група тип данни като съответната колона в първата заявка.
Пример за грешка
Ето пример за код, който произвежда тази грешка:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Резултат:
ORA-01790: expression must have same datatype as corresponding expression
Проблемът тук е, че се опитвам да комбинирам TeacherName
колона в първата заявка с StudentId
колона във втората заявка.
В моя случай TeacherName
колоната е varchar(50)
колона, но StudentId
колоната е int
колона. Това води до възникване на грешката.
Решение 1
Първото (и вероятно най-често срещаното) решение на горната грешка е да се гарантира, че имаме правилната колона/и във всяка заявка.
В моя случай изглежда съвсем очевидно, че съм подминал грешните колони. Следователно мога да променя горната заявка, както следва:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Резултат:
TEACHERNAME |
---|
Бен |
Сметка |
Кати |
Ейн |
Фей |
Реактивен |
Спайк |
Уорън |
Или мога да направя следното:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Резултат:
TEACHERID | TEACHERNAME |
---|---|
1 | Фей |
1 | Уорън |
2 | Бен |
2 | Реактивен |
3 | Кати |
3 | Спайк |
4 | Кати |
4 | Ейн |
5 | Сметка |
5 | Уорън |
6 | Сметка |
И в двата случая типовете колони, върнати от втората заявка, съвпадат с типовете, върнати от първата заявка.
Решение 2
В някои случаи може да откриете, че имате правилните колони, но техните типове не съвпадат. В такива случаи може да се наложи да преобразувате една от колоните в различен тип данни.
Използвайки нашия пример, бихме могли да направим това:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Резултат:
TEACHERNAME |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Бен |
Сметка |
Кати |
Уорън |
Това вероятно не е най-добрият пример, тъй като комбинира имена с идентификационни номера, но съм сигурен, че разбирате картината. Успяхме да избегнем грешката, като използвахме TO_CHAR(number)
функция за преобразуване на StudentId
колона към char
тип.