我有一个类型变量@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
) ,
答案 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