2011-02-26 5 views
25

Çok basit bir şey üzerinde çalışıyorum. Bir boolean ifadesinin sonuçlarını bir BIT değişkenine atamaya çalışıyorum.TSQL'de, bir ifadenin nasıl değerlendirileceği ve bir BIT alanına nasıl atanacağı?

DECLARE @is_search_term_empty BIT 

SET @is_search_term_empty = (@search_term = '') 

nerede @search_term kodunda başka bir yerde bildirilen bir NVARCHAR(128) geçerli:

Temelde ben böyle bir şey yapmak istiyorum.

şey değerlendirmek ve BIT değişken, yani atamak için sözdizimi dışarı çalışamaz:

SET @is_search_term_empty = (1 > 2) 

teşekkür ederiz.

cevap

23

Bir CASE deyimi ile yapabilirsiniz: Siz sadece bit değişken için bir varsayılan değeri ayarlayabilirsiniz

DECLARE @bitvar BIT 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 

SET @bitvar = CASE 
       WHEN (@search_term = 'abc') THEN 1 
       ELSE 0 
       END 

select @bitvar 
+4

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! :-) –

+3

Bu eski, kabul edilmiş yanıtın downvoter'ı lütfen bir yorum bırakın. Teşekkürler. –

2

sonra sadece bu gibi üzerinde bir IF deyimi geçerlidir:

DECLARE @bitvar BIT = 0     -- << Default value 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 
IF (@search_term = 'abc') SET @bitvar = 1 -- << Value changes if required 

select @bitvar 
1

Şimdi SQL 2012'den IIf() işlevini kullanabilirsiniz. Örneğiniz şimdi şöyle görünecekti;

DECLARE @is_search_term_empty BIT = IIf(@search_term = '', 1, 0); 

Bu, aslında aslında başlık altında bir CASE ifadesidir, ancak sindirimi daha kolaydır.

0

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.

İlgili konular