Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
Вопрос стратегической важности.
Есть вот запрос более 50 полей.
И вот нужно когда инсертю результаты этого запроса в табличку не инсертить записи у которых все суммы в строке равны нулю.
Как это написать красиво и покороче?
можно так
WHERE (поле1 <> 0) OR (полеN <> 0) OR .......
и можно так
WHERE поле1+полN <> 0
а как ещё можно?
10 авг 07, 19:35    [4510884]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Prosyanevich SV
Вопрос стратегической важности.
Есть вот запрос более 50 полей.
И вот нужно когда инсертю результаты этого запроса в табличку не инсертить записи у которых все суммы в строке равны нулю.
Как это написать красиво и покороче?
можно так
WHERE (поле1 <> 0) OR (полеN <> 0) OR .......
и можно так
WHERE поле1+полN <> 0
а как ещё можно?


Well, WHERE поле1+полN <> 0 assumes both поле1 and полN can not have different signs (either both positive or both neagtive) otherwise WHERE поле1+полN <> 0 is not equivalent to WHERE (поле1 <> 0) OR (полеN <> 0). You could use:

WHERE 0 NOT IN (поле1,полN)

SY.
10 авг 07, 19:43    [4510902]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
SY
You could use:

WHERE 0 NOT IN (поле1,полN)



Oops, I confused AND for OR. IN will not work.

SY.

Сообщение было отредактировано: 10 авг 07, 19:55
10 авг 07, 19:53    [4510930]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
SY
Oops, I confused AND for OR. IN will not work. SY.

да. Было красиво, но не работает :)
Так а как написать это?
10 авг 07, 19:57    [4510944]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Elic
Member

Откуда:
Сообщений: 29976
Prosyanevich SV
Так а как написать это?
or быстрее
10 авг 07, 20:13    [4510980]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Vladimir Sitnikov
Member

Откуда: Moscow, NetCracker
Сообщений: 407
Elic
Prosyanevich SV
Так а как написать это?
or быстрее

Ничего вы не понимаете в эстетике....
SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE 0 <> ANY(a, b, c, d)
    /* 0<>a or 0<>b or 0<>c or 0<>b*/
np
10 авг 07, 20:15    [4510985]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
Elic
Prosyanevich SV
Так а как написать это?
or быстрее
Зато длиннее :)
А больше вариантов в природе оракла нет?
10 авг 07, 20:16    [4510986]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
Vladimir Sitnikov
Elic
Prosyanevich SV
Так а как написать это?
or быстрее

Ничего вы не понимаете в эстетике....
SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE 0 <> ANY(a, b, c, d)
    /* 0<>a or 0<>b or 0<>c or 0<>b*/
np


не работает!
10 авг 07, 20:28    [4511017]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
мне не нужна строка со всеми нулями.

SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --эта не нужна
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE 0 <> ANY(x, a, b, c, d)
10 авг 07, 20:34    [4511040]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Prosyanevich SV
мне не нужна строка со всеми нулями.


SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --эта не нужна
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE 0 <> ALL(x, a, b, c, d)

SY.
10 авг 07, 20:39    [4511053]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Sorry, missed NOT:

SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --эта не нужна
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE NOT 0 <> ALL(x, a, b, c, d)

SY.
10 авг 07, 20:41    [4511059]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Messed up again:

SELECT *
  FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
        SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
        SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
        SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
        SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
        SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --эта не нужна
        SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 WHERE NOT 0 = ALL(x, a, b, c, d)

SQL> SELECT *
  2    FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
  3          SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
  4          SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
  5          SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
  6          SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
  7          SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
  8          SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --??? ?? ?????
  9          SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 10   WHERE NOT 0 = ALL(x, a, b, c, d)
 11  /

         X          A          B          C          D
---------- ---------- ---------- ---------- ----------
         1          1          2          0
         1          1          2          1
         2          0          0          0
         3          0          0          0          0
         4          0          0          0          1
         5          1          1          1          1
         6

7 rows selected.

SQL> 

SY.
10 авг 07, 20:48    [4511082]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Actually, there is a caveat. Since ANY ignores NULLs, NOT 0 = ALL(col1,...colN) will not return rows with zeros and NULLs. Not sure how such rows should be treated in your case.

SY.

Сообщение было отредактировано: 10 авг 07, 20:53
10 авг 07, 20:53    [4511092]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
Prosyanevich SV
Member

Откуда: донбасс сити
Сообщений: 622
SY
Messed up again:
         X          A          B          C          D
---------- ---------- ---------- ---------- ----------
         6
7 rows selected.
SQL> 
SY.

I don't need this record
ду ю андестенд ми? :)
10 авг 07, 22:25    [4511362]     Ответить | Цитировать Сообщить модератору
 Re: OR или не OR  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Prosyanevich SV
SY
Messed up again:
         X          A          B          C          D
---------- ---------- ---------- ---------- ----------
         6
7 rows selected.
SQL> 
SY.

I don't need this record
ду ю андестенд ми? :)


No I do not. You said:

Prosyanevich SV
не инсертить записи у которых все суммы в строке равны нулю.

можно так
WHERE (поле1 <> 0) OR (полеN <> 0) OR .......


So compare the results:

SQL> SELECT *
  2    FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
  3          SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
  4          SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
  5          SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
  6          SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
  7          SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
  8          SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --??? ?? ?????
  9          SELECT 0 x, 0 a, 0 b, null c, 0 d FROM dual UNION ALL  --??? ?? ?????
 10          SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 11   WHERE x <> 0 OR a <> 0 OR b <> 0 OR c <> 0 OR d <> 0
 12  /

         X          A          B          C          D
---------- ---------- ---------- ---------- ----------
         1          1          2          0
         1          1          2          1
         2          0          0          0
         3          0          0          0          0
         4          0          0          0          1
         5          1          1          1          1
         6

7 rows selected.

SQL> SELECT *
  2    FROM (SELECT 1 x, 1 a, 2 b, 0 c, NULL d FROM dual UNION ALL
  3          SELECT 1 x, 1 a, 2 b, 1 c, NULL d FROM dual UNION ALL
  4          SELECT 2 x, 0 a, 0 b, 0 c, NULL d FROM dual UNION ALL
  5          SELECT 3 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL
  6          SELECT 4 x, 0 a, 0 b, 0 c, 1 d FROM dual UNION ALL
  7          SELECT 5 x, 1 a, 1 b, 1 c, 1 d FROM dual UNION ALL
  8          SELECT 0 x, 0 a, 0 b, 0 c, 0 d FROM dual UNION ALL  --??? ?? ?????
  9          SELECT 0 x, 0 a, 0 b, null c, 0 d FROM dual UNION ALL  --??? ?? ?????
 10          SELECT 6 x, NULL a, NULL b, NULL c, NULL d FROM dual)
 11   WHERE NOT 0 = ALL(x, a, b, c, d)
 12  /

         X          A          B          C          D
---------- ---------- ---------- ---------- ----------
         1          1          2          0
         1          1          2          1
         2          0          0          0
         3          0          0          0          0
         4          0          0          0          1
         5          1          1          1          1
         6

7 rows selected.

SQL> 

SY.
10 авг 07, 22:55    [4511470]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить