Neden 0, boş dizgeye eşittir?


23

Aşağıdaki T-SQLifadenin neden geri döndüğünü bulmak için biraz yardıma ihtiyacım var 1:

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

Sanırım birileri davranışa neden olan ANSIgibi bir seçeneği SET ANSI_NULLSveya başka bir şeyi değiştirdi .

Benim sorunum, bazı değerlere katılıyorum ve son satırda, birleştirilen 0ve ''doğru olmayan değerlere sahibim .

Yanıtlar:


31

Bu sadece belgelenmiş davranış. Kimsenin ayarlarla uğraştığını sanmıyorum.

MSDN'deki veri türü önceliğine bakın .

Bir işleç farklı veri türlerinin iki ifadesini birleştirdiğinde, veri türü önceliği kuralları, düşük önceliğe sahip veri türünün daha yüksek önceliğe sahip veri türüne dönüştürüleceğini belirtir.

Yorumlarda belirtildiği gibi, boş dize herhangi bir sayısal türde 0'a ve bir tarihe dönüştürüldüğünde 1900-01-01 00: 00: 00.000'e dönüştürülür.

EDIT: Asıl probleminizin tasarımınızın farklı bir veri tipindeki alanlara katılmak zorunda olmanızdan kaynaklandığını düşünüyorum. Bunu aşmanın tek yolu, birleştirme yan tümcesinde sorgu performansına zarar verecek bir dönüşüme sahip olmak. Asıl sorun muhtemelen şema tasarımındadır.

EDIT: Sohbete taşınan yorumlarda çok fazla tartışma yapıldı. Ancak mantıksız görünebilir, boş bir dizgiyi diğer veri türlerine dönüştürmek keyfi değerler üretir.

Bu kod:

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

Bu çıktıyı üretir:

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

Daha sonra bu davranışın önceki diğer veri türleri arasında tutarlı olduğunu ve 0'ı tarihe dönüştürmenin aynı keyfi değeri üretmesini beklediğini ancak beklemiyor olabilirsiniz.

SELECT CONVERT(date, 0)

üretir

İnt türünden tarihe kadar açıkça dönüştürmeye izin verilmez.

Çünkü bu, desteklenen bir dönüşüm değil

süre

SELECT CONVERT(datetime, 0)

İade

Ocak, 01 1900 00:00:00

Yani evet, garip ve keyfi, ama aslında belgelenmiş ve açıklanabilir.


Yorumlar genişletilmiş tartışmalar için değildir; Bu cevapla ilgili konuşma sohbete taşındı .
Paul Beyaz GoFundMonica diyor

2
Davranış CAST('' AS INT)-> 0 bir yerde mi belgeleniyor? Referans eklerseniz çok iyi olur.
Salman

2
@SalmanA: Bu gerektiğini ait "dönüştürme Karakter Verileri" bölümünde belgelendirilmesi Char / varchar belgelerinde , ancak şu anda değil. Dahil edilmesini isteyen bir geribildirim yorum bıraktım.
Heinzi,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.