Есть ли способ написать подготовленный оператор, где значение сравнивается с другим значением в состоянии, и я не знаю, является ли это значение NULL
или нет.Напишите подготовленный оператор с нулевыми значениями в условиях
SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` = :a2
Если я хотел бы использовать это подготовленное заявление с a1 => null
и a2 => 42
, то результирующий запрос будет:
SELECT `foo` FROM `bar` WHERE `a1` = NULL AND `a2` = '42'
Это, конечно, не то, что я хочу. Я должен был бы это в этом случае:
SELECT `foo` FROM `bar` WHERE `a1` IS NULL AND `a2` = '42'
^^
Оба a1
и a2
являются обнуляемым. Я не хочу, чтобы определить-подготовить заявление:
-- I would use this, if both values are not null
SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` = :a2
-- and this, if the expected value of a1 is null
SELECT `foo` FROM `bar` WHERE `a1` IS NULL AND `a2` = :a2
-- and this, if the expected value of a2 is null
SELECT `foo` FROM `bar` WHERE `a1` = :a1 AND `a2` IS NULL
-- and this, if I would expect both values to be null
SELECT `foo` FROM `bar` WHERE `a1` IS NULL AND `a2` IS NULL
Спасибо! Не знал этого оператора (и мог подумать о решении с «OR» вне себя ..!) – stofl
@stofl: Я рад, что вы нашли это полезным. Чтобы выделить что-то, я, возможно, недостаточно подчеркнул ... что ** '<=>' ** оператор сравнения * * нестандартное * расширение доступно * только * в MySQL. (По крайней мере, я не знаю каких-либо других СУБД, которые поддерживают этот оператор.) – spencer7593
Благодарим вас за это. Это не имеет значения в моем случае, потому что мы не остаемся независимыми от dbms. – stofl