|
NLV, NLV2, NULLIF, COALESCE, DECODE
|
|||
---|---|---|---|
#18+
Всем доброго времени суток. Хотел кое что уточнить по поводу 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; В связи с этим очень сложно запомнить не поняв природу и логическое объяснение. В документации нет логического объяснения этому, поэтому обращаюсь к вам. Если поможете понять логику всего этого буду вам очень признателен. Заранее благодарю. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:11 |
|
NLV, NLV2, NULLIF, COALESCE, DECODE
|
|||
---|---|---|---|
#18+
endy 1 может быть литералом SQL Reference. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:19 |
|
NLV, NLV2, NULLIF, COALESCE, DECODE
|
|||
---|---|---|---|
#18+
-2-, Не совсем понял, что вы хотите сказать. Возможно я ошибся в терминологии. Я хотел сказать что тип данных number может неявно преобразовываться в тип данных varchar2. Но суть моего вопроса не в этом, а в том как между собой относятся и взаимодействуют типы данных в указанных функциях, так как насколько я понял они работают по разному. В то время как аргументы NVL могу быть преобразованы неявно в другой тип данных, в других функциях - наоборот не могут. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:23 |
|
NLV, NLV2, NULLIF, COALESCE, DECODE
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 11:02 |
|
NLV, NLV2, NULLIF, COALESCE, DECODE
|
|||
---|---|---|---|
#18+
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.
COALESCE ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 12:05 |
|
|
start [/forum/topic.php?fid=52&fpage=48&tid=1881357]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 23ms |
total: | 160ms |
0 / 0 |