基于参数的条件WHERE语句?

时间:2019-01-14 15:24:17

标签: mysql sql

我试图在存储过程中有条件地创建一个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的存储过程。

编辑:假设已经告诉我我的第一个查询应该执行此操作,但是它始终返回listcustomersactive = 1,这可能是类型问题吗?我将customerInactive设置为int(11)。我也只是尝试了一下(1),但是无论我的参数设置为TRUE还是我仍然遇到相同的问题。或者在第二个查询的情况下,没有结果。

编辑2:我认为这无关紧要,但是最终结果是多个表的并集,而我将不得不对它们进行相同的筛选。整个SQL查询可以在这里看到-https://pastebin.com/6wL4ZtnF

2 个答案:

答案 0 :(得分:0)

考虑您的评论,这是您想要的结果,具体取决于customerInactive和listcustomers.active的值

@customerInactive | listcustomers.active | result
------------------+----------------------+--------
 0                | 0                    | 1
 0                | 1                    | 1
 1                | 0                    | 1
 1                | 1                    | 0

这是一个NAND(非与),可以用SQL编写:

NOT (@customerInactive = 1 AND listcustomers.active = 1)

答案 1 :(得分:0)

正确的答案是我混淆了参数和用户定义的变量。我将customerInactive作为参数传递给存储过程,因此我应该直接按名称引用它。使用@使其看起来像是一个未定义的用户定义变量,因此,我的初始等式不断失败,并且为什么始终启用true过滤器。谢谢大家。