2012-05-02 23 views
5

Tôi có một bảng Oracle và một cột (col1) có loại varchar2(12 byte). Nó có một hàng và giá trị của col11234Tôi có thể vượt qua một số cho varchar2 trong Oracle?

Khi tôi nói

select * from table where col1 = 1234 

Oracle cho biết số không hợp lệ. Tại sao vậy? Tại sao tôi không thể vượt qua một số khi nó là varchar2?

CHỈNH SỬA: Tất cả các câu trả lời đều tuyệt vời. Cảm ơn bạn. Nhưng tôi không thể hiểu tại sao nó không mất 1234 khi 1234 là một kiểu dữ liệu varchar2 hợp lệ.

Trả lời

5

Vấn đề là bạn mong đợi rằng Oracle sẽ ngầm sử dụng 1234 cho một loại ký tự. Ngược lại, Oracle đang ngầm đúc cột đến một số. Có một giá trị không phải là số trong cột, vì vậy Oracle ném một lỗi. Các Oracle documentation cảnh báo chống lại implicit phôi ngay trước khi nó giải thích làm thế nào họ sẽ được giải quyết. Quy tắc giải thích hành vi bạn thấy là:

Khi so sánh giá trị ký tự với giá trị số, Oracle chuyển đổi dữ liệu ký tự thành giá trị số.

+0

Cảm ơn. do đó, ký tự là 1234, mà oracle đang chuyển đổi hoàn toàn thành một số. SO tại sao lỗi kể từ 1234 là một số hợp lệ? – Victor

+0

Nội dung nào đó trong bảng không phải là số. Oracle để lại 1234 dưới dạng một số. Nó đang cố gắng chuyển đổi giá trị trong cột để khớp. Khi nó tìm thấy một giá trị không phải là một số, nó sẽ phát ra lỗi. – JAQFrost

4

Ồ, nó là tốt hơn để chuyển đổi để char chứ không phải là con số:

select * 
from table 
where col1 = to_char(1234) 

Khi col1 không giống như một số, to_number trả về một lỗi, ngăn chặn các truy vấn.

3

Oracle cho biết số không hợp lệ. Tại sao vậy? Tại sao tôi không thể vượt qua một số khi nó là varchar2?

Oracle thực hiện chuyển đổi ẩn từ loại ký tự thành số, vì bạn đang so sánh nó như một số.

Ngoài ra, bạn giả định rằng 1234chỉ hàng đang được tìm nạp. Trong thực tế, Oracle phải lấy tất cả các hàng từ bảng, và sau đó lọc ra theo mệnh đề where. Bây giờ có một giá trị ký tự trong col1 đang được tìm nạp trước khi nó gặp hàng 1234 của bạn & gây ra lỗi, vì ký tự không thể được chuyển đổi thành một số.

This fiddle hiển thị hành vi. Kể từ abc canot được chuyển đổi sang một số, bạn nhận được thông báo lỗi


Bây giờ nếu chỉ kỷ lục trong bảng là các col1 chứa một ký tự số, bạn sẽ thấy rằng statement will work fine

+0

Cảm ơn. lời giải thích rất hay – Victor

Các vấn đề liên quan