Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подскажите как упростить  [new]
нубик___
Guest
есть запрос:
select  (case when func('123') is not null then ' ' || func('123') end) from dual
Все бы хорошо, но func() считается дважды ... как его переделать чтобы функция считалась один раз?
22 фев 11, 16:34    [10274902]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
нубик___,
WITH f as (
SELECT rownum,
       func('123') f_val
  FROM dual
)

select case when f_val is not null
       then ' ' || f_val 
       end
  from f
22 фев 11, 16:38    [10274921]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
NULLIF(' ' || func, ' ')
22 фев 11, 16:40    [10274946]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
bdsm_sql
NULLIF(' ' || func, ' ')

2 вызова )
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
22 фев 11, 16:43    [10274966]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
нубик___
Guest
Всем спс, разобрался
22 фев 11, 16:45    [10274981]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54369
нубик___
Всем спс, разобрался


покажь
22 фев 11, 20:36    [10276071]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ORA__SQL
bdsm_sql
NULLIF(' ' || func, ' ')

2 вызова )
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production

да, уж.. на 11.2 - аналогично.
а ниже - соответственно, 4 и 8
select nullif(nullif(' '||fu,null),null) from dual;
select nullif(nullif(nullif(' '||fu,null),null),null) from dual;
чума
22 фев 11, 21:24    [10276150]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
это не шутка? проверить пока не могу
22 фев 11, 21:35    [10276171]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
bdsm_sql
это не шутка? проверить пока не могу


+
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create or replace package pck1 is
  2    function f1 return number;
  3    function f2 return number deterministic;
  4  END;
  5  /

Package created.

SQL> create or replace package body pck1 is
  2    g_n number := 0;
  3    function f1 return number is
  4    begin
  5      g_n := g_n +1;
  6      return g_n;
  7    end;
  8    function f2 return number deterministic is
  9    begin
 10      g_n := g_n +1;
 11      return g_n;
 12    end;
 13  END;
 14  /

Package body created.

SQL> select nullif(nullif(nullif(' '||pck1.f1,null),null),null) f1 from dual;

F1
-----------------------------------------
 8

SQL> /

F1
-----------------------------------------
 16

SQL> /

F1
-----------------------------------------
 24

SQL> select nullif(nullif(nullif(' '||pck1.f2,null),null),null) f2 from dual;

F2
-----------------------------------------
 25

SQL> /

F2
-----------------------------------------
 26

SQL> /

F2
-----------------------------------------
 27
23 фев 11, 10:46    [10277499]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ну и конкатенация тут не при чём. эффект стойкий, и без ея
23 фев 11, 10:52    [10277530]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
жесть.. странное поведение
ну хоть deterministic спасает

странное почему:
что будет если создать ф-ию, которая первый раз вернет 1, а второй раз 2 - что тогда будет при вычислении, скажем, NULLIF(pkg.func, 2)?
23 фев 11, 11:41    [10277722]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
bdsm_sql
жесть.. странное поведение
ну хоть deterministic спасает

странное почему:
что будет если создать ф-ию, которая первый раз вернет 1, а второй раз 2 - что тогда будет при вычислении, скажем, NULLIF(pkg.func, 2)?

да полный пипец будет
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

 SQL> create or replace package pck1 is
  2    g_n number := 0;
  3    function f1 return number;
  4    function f2 return number deterministic;
  5  END;
  6  /

Package created.

SQL> create or replace package body pck1 is
  2    function f1 return number is
  3    begin
  4      g_n := g_n +1;
  5      return g_n;
  6    end;
  7    function f2 return number deterministic is
  8    begin
  9      g_n := g_n +1;
 10      return g_n;
 11    end;
 12  END;
 13  /

Package body created.

SQL> exec pck1.g_n :=0;

PL/SQL procedure successfully completed.

SQL> select nullif(nullif(nullif(pck1.f1,1),null),null) f1 from dual;

        F1
----------
         7
23 фев 11, 11:59    [10277810]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54369
bdsm_sql
жесть.. странное поведение
ну хоть deterministic спасает

странное почему:
что будет если создать ф-ию, которая первый раз вернет 1, а второй раз 2 - что тогда будет при вычислении, скажем, NULLIF(pkg.func, 2)?
как вы собираетесь использовать такую недетерминированую функцию?
:)
23 фев 11, 13:04    [10278113]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
-2-
Member

Откуда:
Сообщений: 15330
Вроде нигде не гарантируется, что недетерминистик будет вызвана в запросе один раз, если упоминается один раз. Как и детерминистик.

nullif - if A=b then null; else A; end
23 фев 11, 13:21    [10278176]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
andreymx
bdsm_sql
жесть.. странное поведение
ну хоть deterministic спасает

странное почему:
что будет если создать ф-ию, которая первый раз вернет 1, а второй раз 2 - что тогда будет при вычислении, скажем, NULLIF(pkg.func, 2)?
как вы собираетесь использовать такую недетерминированую функцию?
:)

ну вот хочу я выводить отношение какой-то величины к своей функции. результат постоянно меняется, в т.ч. числе может быть 0.
получается, выражение NULLIF(func, 0) вполне может дать в результате 0, что приведет к ошибке
мне кажется такое поведение неправильным. не важно, deterministic ф-ция или нет - имхо, надо считать значение, и оперировать уже им. в таком случае, DECODE(func, 1, 0, 2, 0, 1) тоже можно развернуть как IF func = 1 then 0 ELSE IF func = 2 THEN 0 ELSE 1, но ведь ф-ция в DECODE дважды не считается? почему считается здесь?
23 фев 11, 13:40    [10278240]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
-2-
Member

Откуда:
Сообщений: 15330
bdsm_sql
но ведь ф-ция в DECODE дважды не считается? почему считается здесь?
nullif(func, 'x') = decode(func, 'x', func)
23 фев 11, 14:05    [10278327]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
-2-
bdsm_sql
но ведь ф-ция в DECODE дважды не считается? почему считается здесь?
nullif(func, 'x') = decode(func, 'x', func)

nullif(func, 'x') = decode(func, 'x', NULL, func)
ну да не суть. мне кажется неправильным возвращать не то значение, с которым проводилось сравнение. пример я описал выше.
23 фев 11, 14:33    [10278441]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
-2-
bdsm_sql
но ведь ф-ция в DECODE дважды не считается? почему считается здесь?
nullif(func, 'x') = decode(func, 'x', func)

вот екзерцисы (выше) показывают, что категорически не так.
decode аналогичной (тройной) вложенности вызовет ту функцию от одного до четырёх (1+3 = 4) раз - в зависимости от ветвления
(от значений) но никак не 8 или 7. причем там, где 7 - главный прикол, что результат же в итоге должен быть null
23 фев 11, 15:06    [10278578]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
не поленился снять трассу 53 с
SELECT NULLIF(TRUNC(dbms_random.value(0, 10)), 0) FROM dual
и вот оно:)
SELECT CASE  WHEN TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))=0 THEN NULL ELSE TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10)) END  "NULLIF(TRUNC(DBMS_RANDOM.VALUE" FROM "SYS"."DUAL" "DUAL"
неудивительно, что 0 также успешно возвращается)
24 фев 11, 11:14    [10281869]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
bdsm_sql
не поленился снять трассу 53 с
SELECT NULLIF(TRUNC(dbms_random.value(0, 10)), 0) FROM dual
и вот оно:)
SELECT CASE  WHEN TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))=0 THEN NULL ELSE TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10)) END  "NULLIF(TRUNC(DBMS_RANDOM.VALUE" FROM "SYS"."DUAL" "DUAL"
неудивительно, что 0 также успешно возвращается)

честно намекалось
24 фев 11, 11:25    [10281956]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ну, всё верно.
если человек будет переписывать
nullif(nullif(nullif(f,:1),:2),:3)
,то у него получится
decode(f,:3,null,decode(f,:2,null,decode(f,:1,null,f)))
а если железная пила, то
decode(decode(decode(f,:1,null,f),:2,null,decode(f,:1,null,f))
      ,:3,null
      ,decode(decode(f,:1,null,f),:2,null,decode(f,:1,null,f)))
24 фев 11, 12:41    [10282765]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
Elic
Member

Откуда:
Сообщений: 29976
orawish
если человек будет переписывать
nullif(nullif(nullif(f,:1),:2),:3)
,то у него получится
decode(f,:3,null,decode(f,:2,null,decode(f,:1,null,f)))
У меня не получается
decode(f, :3,null, :2,null, :1,null, f)
24 фев 11, 14:02    [10283528]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
Elic
orawish
если человек будет переписывать
nullif(nullif(nullif(f,:1),:2),:3)
,то у него получится
decode(f,:3,null,decode(f,:2,null,decode(f,:1,null,f)))
У меня не получается
decode(f, :3,null, :2,null, :1,null, f)

SELECT NULLIF(NULLIF(NULLIF(1, 0), 0), 0) FROM dual
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT CASE CASE 1 WHEN 0 THEN NULL ELSE 1 END  WHEN 0 THEN NULL ELSE CASE 1 WHEN 0 THEN NULL ELSE 1 END  END  "NULLIF(NULLIF(NULLIF(1,0),0),0" FROM "SYS"."DUAL" "DUAL"
24 фев 11, 14:14    [10283633]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic
..У меня не получается
decode(f, :3,null, :2,null, :1,null, f)

ну, ты то - железный человек :)
24 фев 11, 14:14    [10283639]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как упростить  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
такое ощущение что еще и глючит
SELECT NULLIF(NULLIF(NULLIF(TRUNC(dbms_random.value(0, 10)), 1), 2), 3) FROM dual
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT CASE  WHEN CASE  WHEN CASE  WHEN TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))=1 THEN NULL ELSE
TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10)) END =2 THEN NULL ELSE CASE  WHEN TRUNC
("SYS"."DBMS_RANDOM"."VALUE"(0,10))=1 THEN NULL ELSE TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))
END  END =3 THEN NULL ELSE CASE  WHEN CASE  WHEN TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))=1
THEN NULL ELSE TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10)) END =2 THEN NULL ELSE CASE  WHEN TRUNC
("SYS"."DBMS_RANDOM"."VALUE"(0,10))=1 THEN NULL ELSE TRUNC("SYS"."DBMS_RANDOM"."VALUE"(0,10))
END  END  END  "NULLIF(NULLIF(NULLIF(TRUNC(DBM" FROM "SYS"."DUAL" "DUAL"
24 фев 11, 14:17    [10283667]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить