Mengapa 0 sama dengan string kosong?

23

Saya butuh bantuan dalam menemukan mengapa T-SQLpernyataan berikut kembali 1(benar):

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

Saya kira seseorang telah mengubah ANSIopsi seperti SET ANSI_NULLSatau sesuatu yang menyebabkan perilaku tersebut.

Masalah saya adalah bahwa saya menggabungkan beberapa nilai dan di set baris terakhir saya memiliki nilai yang digabungkan dengan 0dan ''nilai - nilai, yang tidak benar.

Gotqn
sumber

Jawaban:

31

Itu hanya perilaku yang terdokumentasi. Saya tidak berpikir ada yang mengacaukan pengaturan.

Lihat prioritas tipe data pada MSDN.

Ketika seorang operator menggabungkan dua ekspresi dari tipe data yang berbeda, aturan untuk presedensi tipe data menentukan bahwa tipe data dengan prioritas lebih rendah dikonversi ke tipe data dengan prioritas lebih tinggi.

Seperti yang tercantum dalam komentar, string kosong akan dikonversi ke 0 dalam jenis numerik apa pun dan ke 1900-01-01 00: 00: 00.000 saat dikonversi ke tanggal.

EDIT: Saya pikir masalah Anda sebenarnya adalah desain Anda sehingga Anda harus bergabung di bidang tipe data yang berbeda. Satu-satunya cara untuk mengatasi ini adalah dengan memiliki konversi pada klausa bergabung Anda yang akan merusak kinerja kueri. Masalah utama mungkin dengan desain skema

EDIT: Ada banyak diskusi di komentar yang telah dipindahkan ke obrolan. Betapapun tidak logisnya, mengonversi string kosong ke tipe data lain menghasilkan nilai arbitrer.

Kode ini:

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

Menghasilkan output ini:

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

Anda bisa berharap kemudian bahwa perilaku ini konsisten antara tipe data sebelumnya dan berharap bahwa mengubah 0 ke tanggal akan menghasilkan nilai arbitrer yang sama tetapi tidak.

SELECT CONVERT(date, 0)

Menghasilkan

Konversi eksplisit dari tipe data ke tanggal tidak dibolehkan.

Karena itu bukan konversi yang didukung

sementara

SELECT CONVERT(datetime, 0)

Kembali

1 Januari 1900 00:00:00

Jadi ya, ini aneh dan sewenang-wenang, tetapi sebenarnya didokumentasikan dan dijelaskan.

Tom V - Tim Monica
sumber
Komentar bukan untuk diskusi panjang; percakapan tentang jawaban ini telah dipindahkan ke obrolan .
Paul White mengatakan GoFundMonica
2
Apakah perilaku CAST('' AS INT)-> 0 didokumentasikan di suatu tempat? Akan lebih baik jika Anda menambahkan referensi.
Salman A
2
@SalmanA: Itu harus didokumentasikan di bagian "Konversi Data Karakter" dari dokumentasi char / varchar , tetapi saat ini tidak. Saya telah meninggalkan komentar umpan balik yang meminta untuk dimasukkan.
Heinzi