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

57

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

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 не будет существовать.

Теги:
dbnull

5 ответов

86
Лучший ответ

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

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

  • 0
    Бах это были квадратные скобки. Спасибо за это. Меня сводило с ума то, что в документации говорилось, что это поддерживается (также есть слияние), но это не сработало. Один из тех дней...
28

Попробуйте это

ifnull(X,Y)  

e.g

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 я хотел ... Мне просто нужно было снять квадратные скобки, которые я использовал.
  • 2
    Почему мой ответ отклоняется?
Показать ещё 1 комментарий
17

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

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

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

  • 1
    Функция ifnull является SQLite-эквивалентом функции isnull о которой задавался вопрос. Всем, кто читает это сейчас, ознакомьтесь с ответом SQLMenace (тем не менее, более чем на полтора года назад), прежде чем писать собственное решение с использованием CASE .
  • 1
    @ spaaarky21 - Вы делаете хорошую мысль. Однако этот ответ полезен для тех, кто потенциально использует sqlite только для модульного тестирования и использует другую СУБД для живого кода. В этом случае использование чего-то вроде операторов CASE может иметь больше смысла, чем IFNULL .
Показать ещё 1 комментарий
1

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

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

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

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);}
  • 3
    Это не SQLite.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню