首页 > 解决方案 > 基于参数的条件 WHERE 语句?

问题描述

我正在尝试有条件WHERE地在存储过程中创建一个子句。它充当布尔列上的过滤器,我只想要两个结果 - 要么只取真值,要么取所有它们(没有我只需要假值的情况)。

我试图使用的条款是这样的 -

WHERE 
(@customerInactive = -1 OR `listcustomers`.`active` = 1)

这个想法要么参数是-1(无过滤器),要么我们确实有一个过滤器,应该做listcustomers.active = 1。

我也尝试更明确

WHERE
((@customerInactive = 1 AND `listcustomers`.`active` = 1) OR 
(@customerInactive <> 1 AND 1=1))

第二个最终没有返回任何东西。我怎样才能解决这个问题?

这是在一个存储过程中,使用 MySQL 5.6。

编辑:鉴于我被告知我的第一个查询应该这样做,但它总是返回listcustomers. active= 1,这可能是类型问题吗?我将 customerInactive 设为 int(11)。我也只是尝试了一下(1),但我仍然遇到同样的问题,无论我的参数如何,我都得到了 TRUE 过滤器。或者在第二个查询的情况下,没有结果。

编辑2:我认为这无关紧要,但最终结果是多个表的联合,我将不得不对这些表进行同样的过滤。整个 SQL 查询可以在这里看到 - https://pastebin.com/6wL4ZtnF

标签: mysqlsql

解决方案


正确的答案是我混淆了参数和用户定义的变量。我将 customerInactive 作为参数传递给存储过程,所以我应该直接按名称引用它。使用@它使它看起来像一个未定义的用户定义变量,因此我的初始相等性不断失败以及为什么真正的过滤器总是打开。感谢大家。


推荐阅读