Tại sao 0 bằng chuỗi rỗng?


23

Tôi cần một số trợ giúp để tìm lý do tại sao T-SQLcâu lệnh sau trả về 1(true):

SELECT IIF( 0 = '', 1, 0)

Tôi đoán ai đó đã thay đổi một ANSItùy chọn như SET ANSI_NULLShoặc một cái gì đó khác gây ra hành vi.

Vấn đề của tôi là tôi đang tham gia một số giá trị và trong tập hợp hàng cuối cùng tôi có các giá trị được nối bởi 0''các giá trị, không đúng.

Câu trả lời:


31

Đó chỉ là hành vi được ghi nhận. Tôi không nghĩ có ai nhầm lẫn với các thiết lập.

Xem ưu tiên loại dữ liệu trên MSDN.

Khi một toán tử kết hợp hai biểu thức của các loại dữ liệu khác nhau, các quy tắc về quyền ưu tiên loại dữ liệu xác định rằng loại dữ liệu có mức ưu tiên thấp hơn được chuyển đổi thành loại dữ liệu có mức độ ưu tiên cao hơn.

Như đã lưu ý trong các nhận xét, chuỗi trống được chuyển đổi thành 0 ở bất kỳ loại số nào và thành 1900-01-01 00: 00: 00.000 khi được chuyển đổi thành một ngày.

EDIT: Tôi nghĩ vấn đề thực sự của bạn là thiết kế của bạn để bạn phải tham gia vào các trường thuộc loại dữ liệu khác nhau. Cách duy nhất để giải quyết vấn đề này là chuyển đổi thành mệnh đề tham gia của bạn, điều này sẽ ảnh hưởng đến hiệu năng truy vấn. Vấn đề chính có lẽ là với thiết kế lược đồ

EDIT: Có rất nhiều cuộc thảo luận trong các bình luận đã được chuyển sang trò chuyện. Tuy nhiên có vẻ phi logic, việc chuyển đổi một chuỗi rỗng sang các loại dữ liệu khác tạo ra các giá trị tùy ý.

Mã này:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

Sản xuất đầu ra này:

0
0
1900-01-01
1900-01-01 00:00:00.000

Sau đó, bạn có thể mong đợi rằng hành vi này phù hợp giữa các kiểu dữ liệu trước đó và hy vọng rằng việc chuyển đổi 0 thành một ngày sẽ tạo ra cùng một giá trị tùy ý nhưng không.

SELECT CONVERT(date, 0)

Sản xuất

Chuyển đổi rõ ràng từ kiểu dữ liệu int đến ngày không được phép.

Bởi vì nó không phải là một chuyển đổi được hỗ trợ

trong khi

SELECT CONVERT(datetime, 0)

Trả về

Tháng 1, 01 1900 00:00:00

Vì vậy, có, nó kỳ lạ và tùy tiện, nhưng thực sự được ghi lại và giải thích.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện về câu trả lời này đã được chuyển sang trò chuyện .
Paul White nói GoFundMonica

2
Là hành vi CAST('' AS INT)-> 0 được ghi lại ở đâu đó? Sẽ thật tốt nếu bạn thêm tài liệu tham khảo.
Salman A

2
@SalmanA: Nó nên được ghi lại trong phần "Chuyển đổi dữ liệu ký tự" trong tài liệu char / varchar , nhưng hiện tại thì không. Tôi đã để lại một bình luận phản hồi yêu cầu đưa nó vào.
Heinzi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.