【问题标题】:Case expression with a parameter fails带参数的案例表达式失败
【发布时间】:2023-03-25 03:48:01
【问题描述】:

如果 Make 不等于“0”,我只想使用 where 条件。这是我尝试过的。这是来自存储过程的 sn-p。查询仅在 Make 不为 0 时有效。为 '0' 时查询失败。

这不是空检查。 @Make 是一个 varchar。它是如何实现的,要么是'0',要么是一个字符串,例如'mazda'。

select *
from In_Inventory
where
and Make = case 
when @Make != '0'
Then @Make
end

【问题讨论】:

  • 只是为了您自己的理解,失败的原因是因为您的案例仅在 make != 0 时返回一个值。如果 Make 为 0,您的查询将只显示“和 Make =”。再说一次,这里没有理由使用案例。请参阅下文了解更好的方法(例如使用 OR)。

标签: sql sql-server select case


【解决方案1】:

试试这样的

SELECT
*
FROM In_Inventory
WHERE @Make = 0
OR Make = @Make 

【讨论】:

  • 感谢您的快速响应,但在这种情况下它不起作用。我需要的是,如果进入存储过程中的 @Make 变量的值等于“0”,则不要在 make 上进行过滤。如果变量等于其他任何内容,请在 make 上过滤。永远不会使用“WHERE Make = 0”,因为 Make 列是一个 varchar,其值如“mazda”等
  • @JeremyKern 我刚刚更新了我的答案。如果@Make = 0 那么什么都不做,否则做Make = @Make。这就是你所追求的吗?
  • 这看起来就是我所追求的。我明天上班时试试看
【解决方案2】:

您不能使用case 表达式返回语法元素(例如where 子句),只能返回值。但是,您可以通过简单的in 条件获得相同的行为:

SELECT *
FROM   In_Inventory
WHERE  @Make IN ('0', Make)

【讨论】:

    【解决方案3】:

    试试这个,

    SELECT
    *
    FROM In_Inventory
    WHERE @Make = 0
    OR Make = @Make
    

    【讨论】:

      【解决方案4】:

      这样试试,

      SELECT *
      FROM In_Inventory
      WHERE (
              Make = 0
              OR Make = @Make
              )
      

      【讨论】:

        猜你喜欢
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多