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

відсутні дужки навколо функції


Бах, це були квадратні дужки. Дякую за це. Зводив мене з розуму, що в документації говориться, що вона підтримується (також є злиття), але це не спрацювало. Один із тих днів ...
Джейсон Даун

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.
Seth Flowers

2
@sethflowers Я бачу значення в реалізації нульових значень за замовчуванням більш нейтральним до СУБД, але це відповідь на інше питання. :) ОП просто просить про еквівалент SQLite isnullв інших системах, і я не хотів би заохочувати людей "котитись самостійно".
spaaarky21

Я просто шукав щось на зразок ifnotnull () або ifnonnull (), щоб доповнити ifnull (), для використання у конкатенації рядків у реченні SELECT для відображення "прізвище, ім'я першого", але об'єдную кому лише у тому випадку, якщо ім'я_першого не є нульовим. Цей підхід дозволив мені це зробити.
steve_0804

3

Використовуйте IS NULLабо IS NOT NULLв реченні WHERE замість методу ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

Будь ласка, редагуйте з додатковою інформацією Відповіді лише для коду та "спробувати це" не рекомендується, оскільки вони не містять вмісту, який можна шукати, і не пояснюйте, чому хтось повинен "спробувати це".
abarisone

1
Це не стосується того, про що запитували. ОП не хоче фільтрувати рядки, що 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);}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.