Эквивалент SQL nvl - без операторов if / case, isnull и coalesce

Есть ли в SQL какие-либо функции, эквивалентные nvl ()?

Или что-то достаточно близкое, чтобы использовать его таким же образом в определенных сценариях?


UPDATE:
no if statements
no case statements
no isnull
no coalesce

select nvl (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;


(expression)

SODIUFOSDIUFSDOIFUDSF

1 row(s) retrieved.

select isnull (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;

  674: Routine (isnull) can not be resolved.
Error in line 1
Near character position 8

select coalesce (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;

  674: Routine (coalesce) can not be resolved.
Error in line 1
Near character position 8

select decode(purge_date, NULL, "01/01/2009", purge_date) from id_rec where id=74115;

  800: Corresponding types must be compatible in CASE expression.
Error in line 1
Near character position 57

Было бы полезно использовать точную версию, которую вы используете. Кроме того, если nvl работает, почему бы не использовать его?

BradC 16.01.2009 21:08

Я не уверен, как узнать, какую версию я использую ... его informix и его старый ... для одного сценария nvl не работает, и я не знаю, почему

CheeseConQueso 16.01.2009 22:27

Каков сценарий, при котором NVL вызывает проблему?

BradC 16.01.2009 22:40

В одной из моих таблиц есть поле "null" ("" или ""), и предполагается, что это имя кого-то. Мы настроили одну клавишу для общего использования и никогда не вводили имя. Наконец, он поразил поклонник, и мне пришлось его исправить, но NVL этого не сделала, мне пришлось обойти это с кучей BS

CheeseConQueso 17.01.2009 00:01

Не забывайте, что в отличие от некоторых других систем, Informix не обрабатывает пустую строку как NULL - они разные. Запуск программы Informix с опцией '-V' должен напечатать некоторую информацию о версии. Название выбранной вами программы тоже может помочь.

Jonathan Leffler 17.01.2009 06:53

Следовательно, вам, вероятно, понадобится условие WHERE somecolumn = '' или эквивалентное (любое количество пробелов, включая ноль, в порядке; вы также можете использовать двойные кавычки вместо одинарных кавычек).

Jonathan Leffler 17.01.2009 06:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
22 582
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

НУЛЕВОЙ (для однократной замены)

или же

КОЛЕСЦЕ (возвращает первое ненулевое выражение среди своих аргументов.)

Я работаю над Sybase 12.5. Ни DECODE, ни NVL не доступны, но ISNULL отлично работает.

Kenny Drobnack 11.04.2012 17:30
Ответ принят как подходящий

Похоже, вы используете Informix.

AFAIK, там есть DECODE:

DECODE(field, NULL, 'it is null, man', field) должен дать тот же результат, что и NVL(field, 'it is null, man')

Укажите точное название и версию СУБД, которую вы используете.

Да, старый informix ... не знаю, какая версия ... я получил эту ошибку из этого синтаксиса select decode (purge_date, NULL, "01.01.2009", purge_date) из id_rec, где id = 74115; 800: Соответствующие типы должны быть совместимы в выражении CASE. Ошибка в строке 1 Рядом с позицией символа 57

CheeseConQueso 16.01.2009 22:31
DECODE работает нормально, но дата, которую вы пытаетесь указать, - это string, или с неявным преобразованием, я думаю, это datetime year to second или что-то еще по умолчанию. Поэтому используйте DECODE(purge_date, NULL, EXTEND('01/01/2009', year to day), purge_date) from id_rec для преобразования в формат purge_date. (Только что заметил, такое же объяснение приведено ниже в ответе @ RET)
TWiStErRob 09.04.2013 17:25

SQL Server: IsNull или COALESCE http://msdn.microsoft.com/en-us/library/ms184325.aspx

Sybase: isnull функция http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks162.htm

Postgres: Я не смог найти ни одного, хотя и не проверил полностью. Предлагает выбрать где IS NULL и строить отсюда http://archives.postgresql.org/pgsql-sql/1998-06/msg00142.php

DB2 - COALESCE http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000780.htm

Проблема с вашим оператором DECODE, который генерирует ошибку 800, проста. '01/01/2009' обрабатывается как строка, и на самом деле это 4-й аргумент, вызывающий ошибку.

Обратите внимание на то, что ввод и вывод оператора DECODE могут быть разными типами данных, поэтому движок требует, чтобы вы были более явными в этом случае. (Вы хотите, чтобы purge_date был преобразован в строку или строку '01/01/2009', или строковый аргумент был проанализирован как дата или исходная дата? У движка нет способа узнать.

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

SELECT DECODE(purge_date, NULL, '01/01/2009'::DATE, purge_date)

Вы также можете записать этот третий аргумент как:

    DATE('01/01/2009')
    MDY(1,1,2009)

в зависимости от версии и личных предпочтений.

Другие вопросы по теме