【问题标题】:IF condition expression evaluation in TSQLSQL 中的 IF 条件表达式求值
【发布时间】:2011-08-03 22:47:04
【问题描述】:

在 C# 等编程语言中,java 如果一个条件有多个带有 AND(&&) 运算符的表达式,那么只有在第一个表达式为真时才计算第二个表达式。

在 TSQL 中呢?具体来说,这是 Microsoft Sql 服务器中存储过程中的一个条件。

IF (exprA AND exprB)

在上述条件下,如果 exprA 为假,那么 exprB 是否会被评估?

【问题讨论】:

  • “视情况而定”。如果它包含EXISTS 子查询,那么几乎总是短路不会发生。你永远不能指望它发生。您可以嵌套CASE 表达式或嵌套IF 表达式以保证它。 I have an open bounty on a similar question at the moment如果有人想看一些额外的案例!

标签: sql-server tsql if-statement expression


【解决方案1】:

如果第一个表达式为假,您不能依赖 SQL Server 不计算第二个表达式。请参阅我对 Martin 在评论中链接的 question 的回答。

【讨论】:

  • 我认为你是对的,而不是依赖它,我应该使用嵌套的 if 或 case。感谢您提供信息。
【解决方案2】:

正如其他人所指出的,这取决于您的 IF 条件。但是,如果您只使用简单的表达式,它会短路。运行以下命令,您将看到第二个表达式中的被零除错误永远不会发生:

IF (1 = 0 AND (1/0) = 0)
BEGIN
    PRINT 'test1'
END
ELSE
BEGIN
    PRINT 'test2'   
END

【讨论】:

    【解决方案3】:

    CASE 语句似乎允许短路,如下例所示:

    -- Conditional Query
    select case when  1>0 and 1/0>0 then 1 else 0 end
    
    -- Short Circuited Conditional Query
    select case when -1>0 and 1/0>0 then 1 else 0 end
    

    【讨论】:

      【解决方案4】:
          create proc ABCDemo1
          (
          @Name varchar(50),
          @date varchar(50)
          )
       as begin
          if(@Name!='' and @date='')
          begin
             select  * from Table1 where condition1
          end
          else if(@Name='' and @date!='')
          begin
             select * from Table2 where condition2
          end
          else if(@Name!='' and @date!='')
          begin
              select * from Table3 where condition3
          end
       end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多