Nếu bạn gặp lỗi “ORA-01790:biểu thức phải có cùng kiểu dữ liệu với biểu thức tương ứng” trong Cơ sở dữ liệu Oracle, có thể là do bạn đang sử dụng một toán tử chẳng hạn như UNION
, INTERSECT
hoặc EXCEPT
để chạy một truy vấn kết hợp, nhưng các cột được trả về bởi mỗi truy vấn sử dụng các nhóm kiểu dữ liệu khác nhau.
Để khắc phục sự cố này, bạn cần đảm bảo rằng mỗi cột được trả về bởi truy vấn thứ hai sử dụng cùng một nhóm kiểu dữ liệu với cột tương ứng trong truy vấn đầu tiên.
Ví dụ về Lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi này:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Kết quả:
ORA-01790: expression must have same datatype as corresponding expression
Vấn đề ở đây là tôi đang cố gắng kết hợp TeacherName
trong truy vấn đầu tiên, với StudentId
trong truy vấn thứ hai.
Trong trường hợp của tôi, TeacherName
cột là một varchar(50)
trừ cột StudentId
cột là một int
cột. Điều này gây ra lỗi.
Giải pháp 1
Giải pháp đầu tiên (và có lẽ là phổ biến nhất) cho lỗi trên là đảm bảo rằng chúng ta có đúng cột / s trong mỗi truy vấn.
Trong trường hợp của tôi, có vẻ như tôi đã vượt qua các cột sai. Do đó, tôi có thể sửa đổi truy vấn trên như sau:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Kết quả:
EDERNAME |
---|
Ben |
Hóa đơn |
Cathy |
Ein |
Faye |
Máy bay phản lực |
Spike |
Warren |
Hoặc tôi có thể làm như sau:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Kết quả:
GIÁO VIÊN | GIẢNG VIÊN |
---|---|
1 | Faye |
1 | Warren |
2 | Ben |
2 | Máy bay phản lực |
3 | Cathy |
3 | Spike |
4 | Cathy |
4 | Ein |
5 | Hóa đơn |
5 | Warren |
6 | Hóa đơn |
Trong cả hai trường hợp, các loại cột được trả về bởi truy vấn thứ hai khớp với các loại được trả về bởi truy vấn đầu tiên.
Giải pháp 2
Trong một số trường hợp, bạn có thể thấy rằng bạn đã có đúng cột, nhưng loại của chúng không khớp. Trong những trường hợp như vậy, bạn có thể cần phải chuyển đổi một trong các cột sang một kiểu dữ liệu khác.
Sử dụng ví dụ của chúng tôi, chúng tôi có thể làm điều này:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Kết quả:
EDERNAME |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Ben |
Hóa đơn |
Cathy |
Warren |
Đây có lẽ không phải là ví dụ tốt nhất vì nó đang kết hợp tên với ID, nhưng tôi chắc chắn rằng bạn sẽ hiểu rõ. Chúng tôi có thể tránh lỗi bằng cách sử dụng TO_CHAR(number)
chức năng chuyển đổi StudentId
cột thành một char
loại.