Как заставить = NULL работать в SQLite? - PullRequest
7 голосов
/ 01 февраля 2012

Учитывая следующую таблицу:

Table: Comedians
=================

Id    First    Middle    Last
---  -------  --------  -------
 1     Bob      NULL     Sagat
 2    Jerry     Kal      Seinfeld      

Я хочу сделать следующий подготовленный запрос:

SELECT * FROM Comedians WHERE Middle=?

для всех случаев.В настоящее время это не работает для случая, когда я передаю NULL через sqlite3_bind_null.Я понимаю, что запрос для фактического поиска значений NULL использует IS NULL, но это означает, что я не могу использовать подготовленный запрос для всех случаев.Я бы на самом деле должен был изменить запрос в зависимости от ввода, что в значительной степени противоречит цели подготовленного запроса.Как мне это сделать?Спасибо!

Ответы [ 4 ]

7 голосов
/ 02 февраля 2012

Вы можете использовать оператор IS вместо =.

SELECT * FROM Comedians WHERE Middle IS ?
4 голосов
/ 02 февраля 2012

Ничего не соответствует = NULL. Единственный способ проверить это с помощью IS NULL.

Вы можете делать разные вещи, но прямолинейный это ...

WHERE
  middle = ?
  OR (middle IS NULL and ? IS NULL)

Если есть значение, которое вы знаете, НИКОГДА не появляется, вы можете изменить его на ...

WHERE
  COALESCE(middle, '-') = COALESCE(?, '-')

Но вам нужно значение, которое буквально появляется НИКОГДА . Кроме того, это запутывает использование индексов, но версия OR также часто может быть отстойной (я не знаю, насколько хорошо SQLite ее обрабатывает).

При прочих равных, я рекомендую первую версию.

2 голосов
/ 02 февраля 2012

NULL это не значение, а атрибут поля. Вместо этого используйте

SELECT * FROM Comedians WHERE Middle IS NULL
0 голосов
/ 02 февраля 2012

Если вы хотите сопоставить все на NULL

SELECT * FROM Comedians WHERE Middle=IfNull(?, Middle)

если хотите, чтобы ни один не совпадал с NULL

SELECT * FROM Comedians WHERE Middle=IfNull(?, 'DUMMY'+Middle)

Смотрите этот ответ: https://stackoverflow.com/a/799406/30225

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