Как построить предложение WHERE с оператором IF со значением OR IS NULL - PullRequest
1 голос
/ 25 мая 2019

Сложно использовать предложение WHERE, если вы хотите фильтровать значение атрибута, которое является значением или имеет значение NULL.

Это для Retool (динамическая среда MySQL).Я пытался разделить его на различные предложения AND, но это кажется сложнее, чем кажется, потому что для значения требуется уравнение, а IS NULL - нет.

SELECT *
FROM table
WHERE filter = IF({{checkbox1.value}} = TRUE,0,1 OR IS NULL) 
ORDER BY order DESC

Что мне нужно, чтобы запросдоставляет список на основе состояния флажка:

Если флажок = истина, я хочу выбрать записи, где значение фильтра равно 0

Если флажок = ложь, я хочу выбрать записи, гдезначение фильтра равно 1 или равно нулю

Ответы [ 4 ]

1 голос
/ 25 мая 2019

Не ясно, что вы проверяете, чтобы быть нулевым, я думаю, вы имеете в виду filter:

SELECT *
FROM table
WHERE 
  ({{checkbox1.value}} AND filter = 0) 
  OR 
  ((NOT {{checkbox1.value}}) AND coalesce(filter, 1) = 1))
ORDER BY order DESC
1 голос
/ 25 мая 2019

Не совсем.Вы можете просто использовать OR:

WHERE (filter = {{checkbox1.value}} OR {{checkbox1.value}} IS NULL)
0 голосов
/ 26 мая 2019

Если флажок = true, я хочу выбрать записи, в которых значение фильтра равно 0

Если флажок = false, я хочу выбрать записи, в которых значение фильтра равно 1 или равно нулю

Почти буквально переведено в коде:

WHERE
  CASE 
    WHEN {{checkbox1.value}} = TRUE  THEN filter = 0
    WHEN {{checkbox1.value}} = FALSE THEN filter = 1 OR filter IS NULL
  END

Это можно сократить до

WHERE
  CASE {{checkbox1.value}}
    WHEN TRUE  THEN filter = 0
    WHEN FALSE THEN COALESCE(filter, 1) = 1
  END

Но поскольку в MySQL TRUE и FALSE являются просто псевдонимами для 1 и 0, вы также можете выразить ту же логику с помощью

WHERE COALESCE(filter, 1) = (NOT {{checkbox1.value}})

или

WHERE COALESCE(filter, 1) = (1 - {{checkbox1.value}})
0 голосов
/ 25 мая 2019

в MySQL, операторы IF в запросе работают следующим образом

IF (условие, value_if_true, value_if_false)

, тогда как 2-й и 3-й параметры являются необязательными, а первый - обязательным.

Таким образом, ответ может быть

ВЫБРАТЬ * ИЗ таблицы, ГДЕ фильтр = IF ({{checkbox1.value}} = ИСТИНА, 0,1) И НУЛЕВОЙ ПОРЯДОК ПО ЗАКАЗУ DESC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...