- 1
Функция nullif( a, b ) возвращает null если a=b, иначе а.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−858.3
Функция nullif( a, b ) возвращает null если a=b, иначе а.
Всем отделом думали зачем это нужно. С трудом высосали пример из пальца. Видимо какой-то индус решил написать функцию века.
gecko 16.11.2009 17:26 # 0
например, если надо вместо null вернуть 0, то это ведь нормально: coalesce(x, 0)
а если в обратную сторону, то nullif(x, 0)
dim1r 17.11.2009 10:08 # −2
coalesce(a,b) =
case
when a is not null then a
when b is not null then b
else null
end;
nullif(a,b)=
case
when a=b then null e
else a
end;
guest 17.11.2009 21:38 # −1
guest 17.11.2009 22:10 # +2
Oleg_quadro 18.11.2009 13:41 # 0
Я вот что заметил: делаешь left join например:
select t1.id, t2.id from t1 left join t2 on (t1.id = t2.id);
так вот у тебя в столбце t2.id будет то значение какое в столбце t1.id, тo null.
Применение функции nullif: (nullif(t1.id, t2.id)), даст значение t1.id, где null в t2.id,
и null в где в t2.id не null,
короче null будет там где есть совпадение, иначе будет данные из первой таблицы.
И это можно использовать для получения тех id таблицы t1, которых нет в t2,
(да, это можно сделать с помощью case, но nullif короче)
То есть мы получаем id из таблицы t1, которых нет в t2, при этом не ограничивая выборку.
dim1r 18.11.2009 14:03 # 0
это тоже самое ?
Oleg_quadro 18.11.2009 19:17 # 0
guest 18.11.2009 19:31 # 0
Oleg_quadro 18.11.2009 20:16 # 0
guest 18.11.2009 20:39 # 0
guest 12.12.2009 00:40 # 0
dim1r 12.12.2009 08:37 # 0
и кодер - сын ошибок трудных
и аналитик - парадоксов друг
guest 16.12.2009 22:41 # 0
...
where _переменная_ is null
Препроцессор заменит _переменная_ на вычисляемое значение, если переменная пуста, получим
where null is null
что идиотия ещё та.
Посему, есть защищающая конструкция вида:
where nullif_integer(_переменная_) is null
которая развернётся в
where nullif(-1, -1) is null
И это будет вполне себе легальным кодом. Вывод - нехер гнать, если не понимаешь.
dim1r 17.12.2009 09:25 # 0
Я извиняюсь, не понял что за предпроцессор.... У вас свой собственный ? Где вы его держите ?
{Посему, есть защищающая}
чтот не понял кого и от кого она защищает
{where nullif_integer(_переменная_) is null}
nullif_integer - гугле не знает такого слова
{where nullif(-1, -1) is null
И это будет вполне себе легальным кодом. }
Чем он легальнее конструкции A is null, которая хоть иногда, да и выдаёт разные результаты, в то время как nullif(-1, -1) is null выдает всегда одно и тоже ?
{Вывод - нехер гнать, если не понимаешь.}
Вывод, Вы такой большой специалист, разбираетесь кто гонит, а кто нет,.. А вот не понимаете что A is null - самая что ни на есть легальньнейшая конструкция.
guest 19.12.2009 21:50 # 0
Собственный. Держим в сарае, боимся, чтоб не сбежал. -- простите, не сдержался
Код SQL сначала прогоняется через фирменный препроцессор. Препроцессор вычисляет значения "внешних" переменных (т.е. они не нативные для SQL); кроме того, введённые пользователем данные тоже являются переменными.
Функция защищает от попадания null-ов туда, куда им не надо.
nullif_integer - реализация функции препроцессора, корпоративная тайна, название изменено. Естественно, нигде ничего и нет.
Возможно, я не умею ничего объяснять, поэтому, сейчас поиграем в К.О.
Предположим, у нас есть переменная $A, куда пользователь может ввести значение, например, сумму платежа. Предположим, у нас есть код, который засунет значение в таблицу, если оно не null.
insert into payments(id, value)
select nextval for PAYMENTS, $A
where $A is not null
Это код для препроцессора. Препроцессор вычисляет значение $A и отдаёт транслятору SQL. Если переменную явно не защитить конструкцией препроцессора, то он недолго думая соорудит вот такое:
insert into payments(id, value)
select nextval for PAYMENTS, null
where null is not null
И за это будет подвергнут анальной каре от транслятора, потому что null is not null - некошерно никоим образом. Пользуясь обёрткой, получим что-то вида:
...
where nullif_integer($A) is not null
Препроцессор не дурак, сверит переменную с null-ом и обнаружит, что таки да - пусто. Поскольку логика работы запроса препроцессору неизвестна, он не может отключать или подавлять строки. Также он не сможет оценить то, что в этом случае запрос не выполнится. Вместо этого он вместо реального значения переменной подставляет nullif.
...
where nullif(-1, -1) is not null
Транслятор вычислит nullif от двух аргументов (это null, как ни странно), сравнит 'null is not null' и не вывалится ничего.
Пожалуйста, риальне рабочий пример, зачем это может быть надо и как это использовать. Т.е. для получения гарантированного null-a, который ну низя подставлять.
dim1r 22.12.2009 16:40 # 0
Я так понял, что nullif() хорош, что бы в эмулировать null во внешней программе, где язык программирования не содержит null. В программе считаем, что A=-1 - это null. Тогда в sql надо делать обертку "nullif(:A, -1) is null".
В общем null и так жизнь усложняет для sql программиов. Теперь есть возможность усложнить жизнь для других языков.
guest 22.12.2009 18:50 # +1
from table1
Так можно защититься от деления на ноль...
guest 24.12.2009 12:34 # 0
guest 24.12.2009 12:44 # 0
SELECT i.*,
nullif(
nvl(a, 0) + nvl(b, 0) + nvl(c, 0),
decode(a, NULL, 0) + decode(b, NULL, 0) + decode(c, NULL, 0)
) r
FROM
(
SELECT 1 a, 2 b, 3 c FROM dual UNION ALL
SELECT NULL a, 2 b, 3 c FROM dual UNION ALL
SELECT NULL a, NULL b, 0 c FROM dual UNION ALL
SELECT NULL a, NULL b, NULL c FROM dual
) i
A B C R
---------- ---------- ---------- ----------
1 2 3 6
2 3 5
0 0
Короче, автору поста - "нереспект и неуважуха паполной"
guest 24.12.2009 12:44 # 0
dim1r 24.12.2009 12:59 # 0
...
NVL2( COALESCE(A,B,C), nvl(a, 0) + nvl(b, 0) + nvl(c, 0) , NULL ) R
...
guest 13.01.2010 07:48 # 0
SELECT ...
START WITH t1.id = p_id
CONNECT BY PRIOR DECODE(t1.id, t1.self_id, NULL, t1.id) = t1.id
dim1r 09.02.2010 18:25 # 0
select * from tree where parent_id is null
Причем там в твоем примере nullif() ?
Сначала всем отделом думали зачем этот nullif(), а теперь всеми участниками говнокода мозги ерошим. Единственный нормальное применение 1/nullif(a,0) см выше. Все остальное - от лукавого и криворукого.
guest 16.03.2010 00:28 # 0
dim1r 22.06.2010 13:52 # 0
LNNVL(А)
LNNVL(true) false
LNNVL(false) true
LNNVL(NULL=1) true