powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLV, NLV2, NULLIF, COALESCE, DECODE
5 сообщений из 5, страница 1 из 1
NLV, NLV2, NULLIF, COALESCE, DECODE
    #39946400
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Хотел кое что уточнить по поводу NVL, NVL2, NULLIF, COALESCE и DECODE. Вопрос касается того какие типы данных могу содержать значения аргументов.

Если я правильно смог понять, то аргументы в NVL функции должны быть либо одинаковых типов данных, либо же второй аргумент должен быть в состоянии неявно преобразовываться в тип данных первого аргумента, но никак наоборот. То есть если аргументы не носят одинаковый тип данных и при этом второй аргумент не может неявно преобразовываться в тип данных первого аргумента, то запрос выдаст ошибку, даже если первый аргумент может преобразовываться в тип данных второго аргумента.

Например:

select nvl(1, 'a') from dual; - не работает, так как 'a' не может быть преобразован в число.
select nvl('a', 1) from dual; - работает, так как 1 может быть литералом.

Тоже самое можно сказать и про NVL2.

Первый аргумент может быть носить значение с любым типом данных, но второй и третий аргументы должны быть либо одинакового типа данных, либо третий аргумент должен уметь преобразовываться в тип данных второго аргумента. НО никак не наоборот.

Эти две функции для меня понятны, но что касается остальных, тут некая путаница.


Например функция NULLIF:

select nullif(1, 'a') from dual;
select nullif('a', 1) from dual;

Оба этих запроса не работают. Хотя тот же принцип в nvl и nvl2 работал. Число могло преобразовываться в литерал.

Что касается DECODE функции, тот тоже есть некая нестыковка.

Например:
select decode(1, 'a', 2, 'a') from dual;

ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.

select decode(1, 'a', 2, sysdate) from dual;

ORA-00932: inconsistent datatypes: expected NUMBER got DATE
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
Error at Line: 3 Column: 26

Оба вышеуказанных запроса выдают ошибку, но выдают разные ошибки.
Синтаксис DEOCODE такой:

DECODE(expr1,comp1, iftrue1, [comp2,iftrue2...[ compN,iftrueN]], [iffalse])

И я не могу понять в чем проблема.

Или expr1 не может быть сравнен с comp2 (хотя в том же запросе expr1 сравнивается с comp1) или же iftrue1 не может сравниваться с iffalse что для меня еще страннее. В документации к этим функция я не смог найти ничего такого что могло быть разъяснить мне причину этого.

Что касается COALESCE, насколько я понял из документации все последующие аргументы в этой функции должны быть совместимы с типом данных первого аргумента, также указано что COALESCE это немного расширенный вид NVL.

Если учитывать схожесть с NVL, то числа и дата могут быть преобразованы в литералы.

Так как этот запрос работает:

select nvl('a', 1) from dual;

В то время как усложненный вариант с COLAESCE не работает:

select coalesce('a', 1, 2, 3) FROM dual;


В связи с этим очень сложно запомнить не поняв природу и логическое объяснение. В документации нет логического объяснения этому, поэтому обращаюсь к вам. Если поможете понять логику всего этого буду вам очень признателен.

Заранее благодарю.
...
Рейтинг: 0 / 0
NLV, NLV2, NULLIF, COALESCE, DECODE
    #39946406
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endy
1 может быть литералом
Некорректная терминология и непонимание основ приведения типов обусловлено использованием неполноценных источников.
SQL Reference.
...
Рейтинг: 0 / 0
NLV, NLV2, NULLIF, COALESCE, DECODE
    #39946408
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

Не совсем понял, что вы хотите сказать.

Возможно я ошибся в терминологии.

Я хотел сказать что тип данных number может неявно преобразовываться в тип данных varchar2. Но суть моего вопроса не в этом, а в том как между собой относятся и взаимодействуют типы данных в указанных функциях, так как насколько я понял они работают по разному. В то время как аргументы NVL могу быть преобразованы неявно в другой тип данных, в других функциях - наоборот не могут.
...
Рейтинг: 0 / 0
NLV, NLV2, NULLIF, COALESCE, DECODE
    #39946532
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endy,

1)
The NULLIF function is logically equivalent to the following CASE expression:
CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END

2) decode третий параметр определяет тип результата (по "умолчанию" varchar2)

....
stax
...
Рейтинг: 0 / 0
NLV, NLV2, NULLIF, COALESCE, DECODE
    #39946558
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
endy,

NULLIF :
авторIf both arguments are numeric data types, then Oracle Database determines the argument with the higher numeric precedence, implicitly converts the other argument to that data type, and returns that data type. If the arguments are not numeric, then they must be of the same data type, or Oracle returns an error.

endy
Синтаксис DEOCODE такой:

DECODE(expr1,comp1, iftrue1, [comp2,iftrue2...[ compN,iftrueN]], [iffalse])

Ты откуда это берешь? Почему родную документацию не смотришь?
DECODE :

И смотри внимательнее на аргументы:

endy
Код: plsql
1.
2.
3.
4.
5.
select
  decode(1, -- expr
          'a', 2, -- search, result,
          'a' -- default
         ) from dual;



COALESCE
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLV, NLV2, NULLIF, COALESCE, DECODE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]