Bunun çok zor olmasının nedenlerinden biri, T-SQL'in üç değerli boole mantığı kullanmasıdır. DOĞRU ve YANLIŞ tek seçenek değildir; UNKNOWN da var. NULL değerleriyle benzer bir kavramımız var ve değerlerden boole ifadelerine (=
, IS NULL
, IS NOT NULL
, vb.) Dönüştürmek için birçok dil özelliği var, ancak IS UNKNOWN
gibi bir şey veya doğrudan doğruya çeviri yapmak için başka dil özellikleri yok. boolean ifadesini bir bit veri türüne.
İşte bir örnek çözüm.
DECLARE @bit1 bit = 0,
@bit2 bit = 0,
@result bit;
IF (1 = NULL) SET @bit1 = 1;
IF NOT(1 = NULL) SET @bit2 = 1;
IF @bit1 = @bit2 SET @result = NULL;
ELSE IF @bit1 = 1 SET @result = 1;
ELSE IF @bit2 = 1 SET @result = 0;
SELECT @result as [bit];
Bu örnek aslında dayanır: Eğer gerçekten ihtiyaç varsa Sp_executesql ve çıkış parametreleri ile bu önlemek olabilir - Ne yazık ki bu test ettiğiniz ifadesi (burada 1 = NULL
) kodunda çoğaltılamaz gerektiğini gerektirir NOT (UNKNOWN), DOĞRU değil, UNKNOWN değerini döndürür. Bu açıkça BIT sütununun null olmasıyla ilgilidir. Benzer şekilde, üç değerli boolean mantığından kaçınmak isterseniz, ifade girişlerinizin hiçbirinin boş olamaz olduğundan emin olmalısınız.
Bir CASE bildirimi kullanmanın bir saniyesi olduğunu düşünmüştüm ama çok geçmeden kötü bir hack olduğuna inandım! : P (Benim veya SQL sözdizimi bazen çok garip mi) Neyse, yardım için teşekkürler! :-) –
Bu eski, kabul edilmiş yanıtın downvoter'ı lütfen bir yorum bırakın. Teşekkürler. –