如何使用位类型变量作为SQL Server中where子句中条件的前提条件

时间:2017-09-02 16:40:51

标签: sql-server

我有一个类型变量@ExcludeCB,它允许用户从查询结果中排除某种类型的事务。问题是我如何将这种条件if @ExcludeCB = 1 then TN.TT !='CB'与其他条件结合起来?我使用了CASE WHEN,但它反映了错误。以下是代码的一部分:

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

) ,

2 个答案:

答案 0 :(得分:3)

您似乎正在尝试使用CASE语句获得两个不同的条件,但是您不能这样做,因为CASE的所有部分都必须返回值或NULL(你可以用作列值),在SQL Server中你没有变量/列的布尔类型。

SQL Server的bit类型看起来像布尔值但不同,因为它的可能值是0 / 1,也不是true / {{1} }。使用实际布尔类型,您可以使用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

答案 1 :(得分:0)

app.on('ready', function () { //make api calls var request = require('request'); request('http://www.google.com', function (error, response, body) { console.log('error:', error); // Print the error if one occurred console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received console.log('body:', body); // Print the HTML for the Google homepage. // Create the browser window. mainWindow = new BrowserWindow({ width: 1000, height: 625 }); }); ... }); 是SQL Server中的表达式而不是语句。您需要在谓词中包含CASE表达式以便在WHERE子句中使用。以下方法使用CASE的简单形式,而不是您尝试的搜索CASE

CASE

AND CASE WHEN @ExcludeCB = 1 AND tn.tt <> 'CB' THEN 1 END = 1 为1且CASE不等于'CB'时,此@ExcludeCB表达式的结果为1。然后将CASE结果与谓词中的文字1进行比较,从而产生真正的tn.tt子句条件。否则WHERE表达式将返回CASE,从而产生未知谓词,因为与NULL相比的任何内容都是未知的。然后没有行会满足条件,因为未知不是真的。

您还可以使用NULL来表达没有OR表达式的条件。此示例考虑了CASE NULL值的可能性:

@ExcludeCD