У меня есть запрос
select c from DTO c where trafficLight = ?1
Когда светофор красный или зеленый, он возвращает ожидаемые строки, но когда светофор имеет значение null, он ничего не возвращает. В базе данных есть записи с нулевым светофором. Я знаю, что проверка на null равна "null", но что это лучший способ сделать это здесь? Благодарю.
Мне нужно выражение "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