Чем отличаются операторы SQL "IS" и"="?

я создаю некоторые подготовленные операторы, которые используют параметризованные значения. В качестве примера:

SELECT * FROM "Foo" WHERE "Bar"=@param

иногда @param может быть NULL. В таких случаях, я хочу, чтобы запрос возвращал записи, где Bar is NULL, но приведенный выше запрос этого не сделает. Я узнал, что могу использовать IS оператор для этого. Другими словами:

SELECT * FROM "Foo" WHERE "Bar" IS @param

помимо различного обращения NULL, есть ли какие-либо другие способы, которыми вышеупомянутые два утверждения будут вести себя по-другому? Что, если ... --2--> не NULL, но вместо этого, скажем, 5? Использует IS оператор в этом случае безопасная (и здравомыслящая) вещь? Есть ли какой-то другой подход, который я должен принять?

5 ответов


вам нужны записи из Foo, где Bar = @param, или если @param равен null, где Bar равен null. Некоторые из предлагаемых решений дадут вам нулевые записи с nonnull @param, что не похоже на ваше требование.

Select * from Foo where (@param is null and Bar is null) or (Bar = @param)

Это не говорит, Является ли это Oracle или SQL Server или другой СУБД, потому что они реализуют несколько разные вспомогательные функции. ISNULL SQL(первый, второй), как NVL (первый, второй). Мне нравится SQL Server COALESCE() для общего применимость.

сравнение IS предназначено только для нулевых сравнений.

Если вы используете SQL Server и если вы очень нужно другая таблица истинности логики 3vl для решения вашей проблемы (то есть, если у вас есть конкретная потребность в "NULL=NULL", чтобы быть "истинным" в какой-то момент времени, а также признать, что это устарело и запрещает ваши причины, а не хорошая идея в целом), в вашем блоке кода Вы можете использовать директиву

НАСТРОЙКА ПАРАМЕТРОВ ANSI_NULLS Выкл

вот болт на нем: http://msdn.microsoft.com/en-us/library/ms188048.aspx


вы можете думать об этом неправильно. Если вы говорите о SQL Server, например (так как это то, что я должен передать), ваш второй пример приведет к синтаксической ошибке. Значение с правой стороны IS не может быть равно 5.

чтобы объяснить, рассмотрим объяснение MSDN этих двух операторов в T-SQL (обратите внимание, что запрос о "SQL" и о "SQL Server" не обязательно одинаковы).

оператор равенства ( = )

IS Оператор NULL

обратите внимание на что-то важное. Там нет такой вещи, как оператор "IS" в T-SQL. Существует специально <expression> IS [NOT] NULL оператор, который сравнивает одно выражение с NULL.

это не одно и то же как = оператор, который сравнивает два выражения друг к другу и имеет определенное поведение, когда одно или оба выражения имеют значение NULL!


изменить: (обновление от OP: это не делает то, что я, если @param-5, то я хочу видеть только записи, где Bar-5. Я хочу видеть записи, где Bar равен NULL, если и только если @param равен NULL. Я извиняюсь, если мой вопрос не ясно.)

В таком случае, я думаю, вы должны попробовать что-то вроде этого:

SELECT * FROM Foo WHERE Bar=@param OR (Bar IS NULL AND @param IS NULL)

предыдущий пост:

почему бы просто не использовать OR ?

SELECT * FROM "Foo" WHERE "Bar"=@param OR "Bar" IS NULL

В SQL Server можно использовать Функция isnull:

SELECT * FROM "Foo" WHERE ISNULL("Bar",@param)=@param

Я не знаю, какую версию SQL вы используете, но не имеет смысла в контексте, который вы только что описали. Я получаю синтаксическую ошибку, если пытаюсь использовать ее так, как вы описали. Почему вы хотите использовать его over = в любом случае? Это общее использование и разработчикам программного обеспечения бы ожидать, чтобы найти.


какую конкретную базу данных вы используете?

Если вы выполняете поиск на основе null (или not null), использование IS-это путь. Я не могу предоставить техническую причину, но я использую этот синтаксис все время.

SELECT * FROM Table WHERE Field IS NULL

SELECT * FROM Table WHERE Field IS NOT NULL