2017-09-02 79 views
0

条款我都有点类型变量@ExcludeCB它允许用户排除查询结果的类型交易的标准。问题是,我怎么能把这个条件if @ExcludeCB = 1 then TN.TT !='CB'与其他条件结合起来?我使用了CASE WHEN,但它反映了错误。下面是代码的一部分:如何使用位型变量作为前提条件在SQL服务器中

declare @FVoucher as int; ---- first Accounting Voucher No 

declare @LVoucher as int; ---- last Accounting Voucher No 

declare @ExcludeCB as bit; ---- excluding Transaction type CB 


set @FVoucher = 2004002; 

set @LVoucher = 2004120; 

set @ExcludeCB =1 


WITH ctOB as ---- making a TB prior to the report range 

(Select GLcode, GLname, Sum((case WHEN amount>0 then Amount ELSE 0 END)) as obDebit , 

    Sum((Case When Amount <0 then - Amount ELSe 0 END)) as obCredit 

    From TN 

     WHERE Year(tn.GDate) = Convert(int,substring(Convert(varchar,@fVoucher),1,4)) and tn.VoucherNo < @FVoucher 

     AND Case @ExcludeCB when 1 then tn.tt !='CB' ELSE 1 = 1 END 

    group by GLcode, GLname 

) , 
+1

请[编辑]你的问题,并确保所有的代码被标记为代码,和所有非代码是不是** **喊在美国。 –

+0

案例听起来像是正确的做法;什么是错误? – Xedni

+0

@Xedni - CASE听起来不像是正确的方法。这似乎是一个常见的(我不知道它来自哪里)不仅仅是写布尔逻辑的错误。即编写WHERE子句的其余部分,然后写入AND(@ExcludeCB = 0 OR())'。 –

回答

3

看来你正试图获得与CASE声明两种不同的情况,但你不能这样做,因为CASE的所有部件必须返回一个值或NULL(可以用作列值的东西),并且在SQL Server中,对变量/列没有布尔类型。

SQL Server具有bit类型,它看起来像一个布尔值,但不同的是,因为其可能的值是0/1,也不true/false。使用真正的布尔类型,您可以使用if boolean_varible=true或更好的if boolean_variable来获得布尔条件,但使用bit类型时,您始终必须使用if bit_variable=1

回到你的问题,为了得到你想要的,你可以替换一下:

AND Case @ExcludeCB when 1 then tn.tt !='CB' ELSE 1 = 1 END 

像这样的东西:

AND ((@ExcludeCB=1 and tn.tt !='CB') or @ExcludeCB=0) 
+0

谢谢大家,阿尔贝托的小费为我工作。 –

0

CASE是一种表达,而不是在SQL Server中的语句。您需要在谓词中包含CASE表达式以在WHERE子句中使用。下面的方法使用的CASE代替搜索CASE您试图简单形式:

AND CASE WHEN @ExcludeCB = 1 AND tn.tt <> 'CB' THEN 1 END = 1 

CASE表达式的结果将是1时@ExcludeCB为1且tn.tt不等于“CB”。然后将CASE结果与谓词中的文字1进行比较,从而产生真实的WHERE子句条件。 CASE表达式将返回NULL,导致未知谓词,因为与NULL比较的任何内容都是未知的。然后没有行会满足条件,因为未知是不正确的。

您也可以使用OR来表示没有CASE表达式的情况。这个例子针对一个NULL@ExcludeCD值的可能性:

AND (ISNULL(@ExcludeCB,0) = 0 OR (@ExcludeCB = 1 AND tn.tt <> 'CB')) 
+0

Dan - 这两个选项都不允许对t..tt执行查找操作(假设存在适当的索引)。更好的语法是AND(@ExcludeCB IS NULL OR @ExcludeCB = 0 OR(@ExcludeCB = 1 AND tn.tt <>'CB'))OPTION(RECOMPILE); –

+0

@ JasonA.Long,因为索引不太可能会被使用,因为不相等的运算符,即使使用了替代的语法和提示建议,我也没有考虑在这里寻找。 –

+0

是的,你说得对。我在看一般的代码模式。看到该计划如何根据Colum中CB与非CB值的比例而变化,这将会很有趣。 –