Sql 无论什么情况,返回其他结果时的情况
我有这个选择查询:Sql 无论什么情况,返回其他结果时的情况,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有这个选择查询: SELECT CASE WHEN ( SELECT isnull(( SELECT max(SeqNo) FROM tblReconBankAccountHODetail WHERE BankAccountID = '0MA27' AND Bus
SELECT CASE
WHEN (
SELECT isnull((
SELECT max(SeqNo)
FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27'
AND BusinessDate = '3/12/2018 12:00:00 AM'
), '0')
) = '0'
THEN (
SELECT max(SeqNo) + 1
FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27'
AND BusinessDate = '3/12/2018 12:00:00 AM'
)
ELSE '1'
END SeqNo
当我选择时,我试图根据一些条件获取SeqNo的行数
SELECT isnull(SELECT max(SeqNo) FROM tblReconBankAccountHODetail WHERE BankAccountID = '0MA27')
它将给我结果147,这是正确的,我试图做的是,如果行存在,它将给我第二个查询的行计数+1。这意味着147+1等于148,如果该行不存在,它将给出结果:1
但我的查询总是返回1,如果我删除“1”,我的查询结果将为空。我的查询哪里出错了?您的查询几乎没有问题: SQL语法使用大写,但它不是通用的,因为它不区分大小写。使用小写或大写,但要一致!不要混在一起 适当的缩进大大简化了对查询和代码的一般查看和理解 以下是重构查询:
SELECT CASE WHEN (SELECT ISNULL(MAX(SeqNo), 0) FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM') = 0
THEN (SELECT MAX(SeqNo) + 1 FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM')
ELSE 1 END SeqNo
您的问题是,您将VARCHAR数据类型与INT混合
这一行:
select isnull((SELECT max(SeqNo) from tblReconBankAccountHODetail
where BankAccountID = '0MA27' and BusinessDate = '3/12/2018 12:00:00 AM'),'0')
根据您的信息,将始终返回一个整数:147,然后将其与“0”(即CHAR1)进行比较,从而得到意外的结果
但是,如果内部查询没有返回任何行,则查询将不起作用,因此我建议如下:
SELECT CASE WHEN (SELECT COUNT(*) FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM') = 0
THEN (SELECT COUNT(*) + 1 FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM')
ELSE 1 END SeqNo
或者更简单一些:
SELECT COUNT(*) + 1 FROM tblReconBankAccountHODetail
WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM'
我可以通过在这个查询中声明一个变量@counter来解决这个问题 从tblReconBankAccountHODetail中选择ISNULLMAXSeqNo,0,其中BankAccountID='0MA27'和BusinessDate='2018年12月3日12:00:00 AM' 然后在查询时将@counter放入case:
CASE WHEN @counter= 0
THEN 1
ELSE @counter+1
END SeqNo
向@MichałTurczyn大喊,以获得更清晰的查询
更新:
SELECT CASE
WHEN (select isnull((SELECT max(SeqNo) from tblReconBankAccountHODetail where BankAccountID = '0MA27' and BusinessDate = @rc),'0')) != 0
THEN (SELECT max(SeqNo)+1 from tblReconBankAccountHODetail where BankAccountID = '0MA27' and BusinessDate = @rc)
else 1
END SeqNo
上面的查询也可以使用这个select isnullSELECT maxSeqNo从tblReconBankAccountHODetail中得到什么,其中BankAccountID='0MA27'和BusinessDate='3/12/2018 12:00:00 AM','0'?似乎您正在尝试创建自己的自动增量机制。不要。这在任何多用户环境中都会失败。Sql Server已经有一个内置的标识列-使用它。@Squirrel结果仍然会得到相同的结果,即1: