Jeśli otrzymujesz błąd „ORA-01790:wyrażenie musi mieć ten sam typ danych, co odpowiadające mu wyrażenie” w bazie danych Oracle, to prawdopodobnie dlatego, że używasz operatora takiego jak UNION
, INTERSECT
lub EXCEPT
uruchomić zapytanie złożone, ale kolumny zwracane przez każde zapytanie używają różnych grup typów danych.
Aby rozwiązać ten problem, musisz upewnić się, że każda kolumna zwrócona przez drugie zapytanie używa tej samej grupy typów danych, co odpowiadająca jej kolumna w pierwszym zapytaniu.
Przykład błędu
Oto przykład kodu, który powoduje ten błąd:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Wynik:
ORA-01790: expression must have same datatype as corresponding expression
Problem polega na tym, że próbuję połączyć TeacherName
kolumna w pierwszym zapytaniu z StudentId
kolumna w drugim zapytaniu.
W moim przypadku TeacherName
kolumna to varchar(50)
kolumna, ale StudentId
kolumna to int
kolumna. Powoduje to wystąpienie błędu.
Rozwiązanie 1
Pierwszym (i prawdopodobnie najczęstszym) rozwiązaniem powyższego błędu jest upewnienie się, że w każdym zapytaniu mamy poprawną kolumnę/kolumny.
W moim przypadku wydaje się dość oczywiste, że podałem niewłaściwe kolumny. Dlatego mogę zmodyfikować powyższe zapytanie w następujący sposób:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Wynik:
NAZWISKO NAUCZYCIELA |
---|
Ben |
Rachunek |
Kasia |
Ein |
Faye |
Odrzutowiec |
Skok |
Warren |
Lub mógłbym wykonać następujące czynności:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Wynik:
ID NAUCZYCIELA | NAZWISKO NAUCZYCIELA |
---|---|
1 | Faye |
1 | Warren |
2 | Ben |
2 | Odrzutowiec |
3 | Kasia |
3 | Skok |
4 | Kasia |
4 | Ein |
5 | Rachunek |
5 | Warren |
6 | Rachunek |
W obu przypadkach typy kolumn zwrócone przez drugie zapytanie pasowały do typów zwróconych przez pierwsze zapytanie.
Rozwiązanie 2
W niektórych przypadkach może się okazać, że masz prawidłowe kolumny, ale ich typy nie są zgodne. W takich przypadkach może być konieczne przekonwertowanie jednej z kolumn na inny typ danych.
Korzystając z naszego przykładu, możemy to zrobić:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Wynik:
NAZWISKO NAUCZYCIELA |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Ben |
Rachunek |
Kasia |
Warren |
To prawdopodobnie nie jest najlepszy przykład, ponieważ łączy nazwy z identyfikatorami, ale jestem pewien, że masz zdjęcie. Udało nam się uniknąć błędu, używając TO_CHAR(number)
funkcja do konwersji StudentId
kolumna na char
typ.