Выберите, где значение может быть нулевым или нет

0

У меня есть запрос

select c from DTO c where trafficLight = ?1

Когда светофор красный или зеленый, он возвращает ожидаемые строки, но когда светофор имеет значение null, он ничего не возвращает. В базе данных есть записи с нулевым светофором. Я знаю, что проверка на null равна "null", но что это лучший способ сделать это здесь? Благодарю.

Теги:

1 ответ

2

Мне нужно выражение "where trafficLight =? 1" для оценки всех случаев

"неудача, я боюсь"

NULL - это отсутствие какой-либо ценности, поэтому по определению вы, если используете равный оператор против NULL, НИКОГДА не вернутся true:

where NULL = NULL -- is never true

так как нет никакой ценности для сравнения, просто нет способа узнать, равны они или нет, поэтому "не равно" также не работает. Я понимаю, что это трудно понять, но "это то, что есть", и попробуйте как можно NULL = NULL никогда не будет истинным. Это, однако, будет работать во всех случаях

where (trafficLight = ?1 and ?1 IS NULL)

where (trafficLight = 'red' or 'red' IS NULL)     -- true when trafficLight = 'red'
where (trafficLight = 'amber' or 'amber' IS NULL) -- true when trafficLight = 'amber'
where (trafficLight = 'green' or 'green' IS NULL) -- true when trafficLight = 'green'
where (trafficLight = NULL or NULL IS NULL)       -- true for all
  • 0
    Запрос «where (trafficLight = NULL или NULL IS NULL)» возвращает все строки базы данных, потому что он не присваивает нулевое значение TrafficLight.
  • 0
    правильно, как правило, NULL в переменной используется для возврата всех строк, вы хотите другой результат?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню