【问题标题】:case when returned result of else no matter what无论如何返回 else 的结果的情况
【发布时间】:2018-07-26 05:04:02
【问题描述】:

我有这个选择查询:

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,如果我删除then '1',我的查询将返回NULL。我的查询哪里做错了?

【问题讨论】:

  • 你对这个select isnull((SELECT max(SeqNo) from tblReconBankAccountHODetail where BankAccountID = '0MA27' and BusinessDate = '3/12/2018 12:00:00 AM'),'0')有什么好处?
  • 似乎您正在尝试创建自己的自动增量机制。 不要。这在任何多用户环境中都会失败。 Sql Server 已经有一个内置的标识列 - 使用它。
  • @Squirrel 结果将是147

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

我可以通过声明一个变量 @counter 来解决这个问题

SELECT ISNULL(MAX(SeqNo), 0) FROM tblReconBankAccountHODetail WHERE BankAccountID = '0MA27' AND BusinessDate = '3/12/2018 12:00:00 AM')

然后在查询时将@counter放入大小写:

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

上面的这个查询也有效

【讨论】:

    【解决方案2】:

    您的查询有几个问题:

    1. SQL 语法使用大写,但它不是强制性的,因为它不区分大小写。使用小写或大写,但要保持一致!不要混用。

    2. 适当的缩进极大地简化了查询(以及一般代码)的查看和理解。

    这是重构后的查询:

    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'(即CHAR(1))进行比较,从而得到意想不到的结果。

    但是,如果内部查询没有返回任何行,查询将不起作用,所以我建议如下:

    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'
    

    【讨论】:

    • 仍然得到相同的结果,即1 :(
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2019-03-30
    • 2017-02-19
    • 2017-07-20
    相关资源
    最近更新 更多