【问题标题】:Case statement in sqlserver in where clause with else as always truesql server中的case语句在where子句中,else始终为真
【发布时间】:2015-03-04 22:07:41
【问题描述】:

我使用了永远正确的陈述,例如1 = 1 MYSQL where 子句的 case 语句,语法如下:

select * from tablename where 
(case when tablefield is not null then 
 then tablefield = 'value'
else 1 = 1 end)

我想知道如何在 where 子句的 sqlserver/tsql case 语句中使用 else 1 = 1(始终为真语句)。

【问题讨论】:

  • MySQL 和/或 SQL Server?

标签: mysql sql sql-server tsql case


【解决方案1】:

你不会用例,你只会写一个多条件语句。在你的情况下,它看起来像

Where (tablefield = 'value'
       OR tablefield is null)

【讨论】:

    【解决方案2】:

    如果你想使用 TSQL CASE 函数,你可以这样做:

    select * from tablename where 1 = 
    (case when tablefield is not null then 
        (case when tablefield = 'value' then 1 else 0 end)
     else 1 end) 
    

    可以简化为:

    select * from tablename where 1 = 
    (case when tablefield is null then 1 when tablefield = 'value' then 1 
    else 0 end)
    

    您可以省略“else 0”部分,因为找不到匹配项时,将返回 NULL(不等于 1)。即:

    select * from tablename where 1 = 
    (case when tablefield is not null then 
        (case when tablefield = 'value' then 1 end)
     else 1 end) 
    
    select * from tablename where 1 = 
    (case when tablefield is null then 1 when tablefield = 'value' then 1 end)
    

    【讨论】:

      【解决方案3】:

      对不起,我只是混淆了查询,我打算在参数变量为空而不是表字段时询问条件 在这种情况下,查询可能如下所示:

      select * from tablename where (如果 parameterfield_or_variable 不为空,则 然后 tablefield = '值' 否则 1 = 1 结束)

      或者当使用参数域作为值时 (如果 parameterfield_or_variable 不为空,则 然后 tablefield = parameter_field_or_variable 否则 1 = 1 结束)

      @KHeaney 提出的问题的答案是正确的。

      但是 mysql 中描述的 tsql/sqlserver 中的查询将是这样的:

      从表名中选择 * 其中表字段 = @parameterfield -- 在比较输入参数字段和表字段的情况下 或@parameter 为空

      所以当@parameterfield 为空时,它将显示所有结果,否则它将限制为仅输入值。

      谢谢

      【讨论】:

        【解决方案4】:

        你可以试试……

        select * from tablename
        where tablefield = isnull(@parameter, tablefield)
        

        【讨论】:

          【解决方案5】:

          我知道 T-SQL 和 MySQL 都提供COALESCE,它返回提供的第一个非 NULL 值。

          SELECT *
          FROM tablename
          WHERE (COALESCE(`tablefield`, 'value') = 'value')
          

          【讨论】:

          • 这不会像编码的那样工作。您需要将 1 = 1 替换为“值”,以便如果 tablefield 为空,则将其替换为值。
          • @SeanLange 我明白了。谢谢你的纠正。我错误地解析了CASE 语句。
          猜你喜欢
          • 2021-08-09
          • 1970-01-01
          • 1970-01-01
          • 2013-06-30
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多