Условные операторы WHERE, основанные на параметрах? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь условно создать предложение 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), но у меня все та же проблема, независимо от моего параметра, я получаю ИСТИННЫЙ фильтр. Или в случае второго запроса нет результатов.

Редактировать 2: Я не думаю, что это должно иметь значение, но окончательный результат - объединение нескольких таблиц, из которых мне придется выполнить такую ​​же фильтрацию. Весь SQL-запрос можно посмотреть здесь - https://pastebin.com/6wL4ZtnF

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Правильный ответ: я перепутал параметры и определяемые пользователем переменные. Я передаю customerInactive в качестве параметра хранимой процедуры, поэтому я должен ссылаться на нее напрямую по имени. Использование @ сделало его похожим на пользовательскую переменную, которая НЕ была определена, отсюда постоянный сбой моего начального равенства и почему всегда был включен фильтр true. Спасибо всем.

0 голосов
/ 14 января 2019

Учитывая ваши комментарии, это результаты, которые вы хотите, в зависимости от 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...