Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无论什么情况,返回其他结果时的情况_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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: