Эквивалент SQL nvl - без операторов if / case и isnull & coalesce - PullRequest
1 голос
/ 16 января 2009

Существуют ли в SQL какие-либо эквивалентные функции nvl ()?

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


ОБНОВИТЬ:
нет выражений if
нет выражений case
нет isnull
нет объединения

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

Ответы [ 4 ]

5 голосов
/ 16 января 2009

ISNULL (для однократной замены)

или

COALESCE (Возвращает первое ненулевое выражение среди своих аргументов.)

3 голосов
/ 16 января 2009

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

Sybase: нормальная функция http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks162.htm

Postgres: Я не мог найти один, хотя еще не полностью проверил. Предлагает выбрать где 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

2 голосов
/ 19 января 2009

Проблема с оператором 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)

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

2 голосов
/ 16 января 2009

Вы, кажется, используете Informix.

AFAIK, там есть ДЕКОД:

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

Пожалуйста, опишите точное название и версию используемой СУБД.

...