我试图在存储过程中有条件地创建一个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
答案 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过滤器。谢谢大家。