Эквивалент SQLite ISNULL (), NVL (), IFNULL () или COALESCE ()

92

Я бы не хотел, чтобы в моем коде было много проверок вроде следующего:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Я подумал, что могу просто попросить мой запрос позаботиться о нулях, сделав что-то вроде этого:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Однако я использую SQLite, и он, похоже, не распознает isnullфункцию. Я также пробовал несколько эквивалентных, распознаваемых в других базах данных ( NVL(), IFNULL()и COALESCE()), но SQLite, похоже, не распознает ни одну из них.

Есть ли у кого-нибудь предложения или есть ли способ сделать это лучше? К сожалению, в базе данных нет значений по умолчанию для всех полей. Кроме того, мне нужно использовать некоторые LEFT JOINпредложения в некоторых случаях, когда некоторые из возвращаемых полей будут пустыми, потому что соответствующая запись в LEFT JOINтаблице не существует.

Джейсон Даун
источник

Ответы:

130

IFNULLсм. здесь: http://www.sqlite.org/lang_corefunc.html#ifnull

без скобок вокруг функции

SQLMenace
источник
Бах это были квадратные скобки. Спасибо за это. Меня сводило с ума то, что в документации говорилось, что он поддерживается (также там есть coalesce), но он не работал. В один из тех дней ...
Джейсон Даун,
1
Я понимаю, что ваше описание «без скобок вокруг функции» ссылается на вопрос, но с таким утверждением было бы полезно иметь пример под вашим исходным утверждением.
palswim
40

Попробуй это

ifnull(X,Y)  

например

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

ifnull()Функция возвращает копию своего первого аргумента , не NULL, или NULL , если оба аргумента являются NULL. Ifnull()должно иметь ровно 2 аргумента. ifnull()Функция эквивалентна coalesce()с двумя аргументами.

Хардик Дарджи
источник
1
Да, я понял, что это ifnullя хотел ... Мне просто нужно было снять квадратные скобки, которые я использовал.
Джейсон Даун
@HardikDarji Потому что какой-то довольный администратор, проголосовавший против, увидел слова «попробуйте это» и больше не стал читать. Или потому, что кто-то ошибочно предположил, что ваше сравнение ifnull () с coalesce () ошибочно, как это было бы в других средах db (но не в sqlite). В любом случае, кого это волнует. Ответы «Попробуй» лучше, чем «Прочти документацию». Я каждый раз просматриваю не код, содержащий ответы / даже не читаю их. Спасибо за ответ!
maplemale
25

Если ISNULL()метода нет, вы можете использовать это выражение вместо:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Это работает так же, как ISNULL(fieldname, 0).

Махди Мохаджер
источник
1
Функция ifnullявляется SQLite-эквивалентом isnullфункции, о которой задан вопрос. Всем, кто читает это сейчас, просмотрите ответ SQLMenace (тем не менее, полученный более чем за полтора года ранее), прежде чем писать собственное решение с использованием CASE.
spaaarky21
1
@ spaaarky21 - Вы правильно подметили. Однако этот ответ полезен для тех, кто потенциально использует sqlite только для модульного тестирования и использует другую СУБД для живого кода. В этом случае использование чего-то вроде CASEоператоров может иметь больше смысла, чем IFNULL.
Сет Флауэрс,
2
@sethflowers Я вижу значение в реализации нулевых значений по умолчанию более нейтральным к РСУБД способом, но это ответ на другой вопрос. :) OP просто запрашивает эквивалент SQLite isnullв других системах, и я не хотел бы побуждать людей «кататься самостоятельно».
spaaarky21,
Я просто искал что-то вроде ifnotnull () или ifnonnull (), чтобы дополнить ifnull (), для использования в конкатенации строк в предложении SELECT для отображения «last_name, first_name», но только для конкатенации запятой, если first_name не равно null. Такой подход позволил мне это сделать.
steve_0804
3

Используйте IS NULLили IS NOT NULLв предложении WHERE вместо метода ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Тило
источник
Пожалуйста, отредактируйте с дополнительной информацией. Ответы только на код и «попробуйте это» не приветствуются, потому что они не содержат доступного для поиска контента и не объясняют, почему кто-то должен «попробовать это».
abarisone 06
1
Это не имеет отношения к тому, о чем спрашивали. OP не хочет отфильтровывать строки myField1с ненулевым значением, он хочет заменить значение в столбце результата другим, если значение строки равно нулю.
Даниэль Камил Козар
2

Для эквивалента NVL () и ISNULL () используйте:

IFNULL(column, altValue)

column : Столбец, который вы оцениваете.

altValue : Значение, которое вы хотите вернуть, если "столбец" равен нулю.

Пример:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Примечание: функция COALESCE () работает так же, как и для других баз данных.

Источники:

развратник
источник
-4

Вы можете легко определить такую ​​функцию и затем использовать ее:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

или та же минифицированная версия:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Стас Приходько
источник
4
Это не SQLite.
Даниэль Камил Козар