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

Откуда: Москва
Сообщений: 16
Только не предлагайте подзапросом исключить!
Есть такая табличка, нужно исключить строку если (tp1=1 и tp2 in(2,4))
tp1 tp2 cd
---------------------------------
1 2 жел
1 3 красный
1 4 зел
1 2 жел
2 3 оранж
2 4 белый
4 июл 06, 14:23    [2840963]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Andrei Fomichev
Member

Откуда: Москва
Сообщений: 453
select * 
from table 
where not (tp1=1 and tp2 in(2,4))
4 июл 06, 14:27    [2840991]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
а в чем проблема

select * from <table>
where not(tp1=1 and tp2 in(2,4));

select * from <table>
where tp1!=1 or tp2 not in(2,4));


;)
4 июл 06, 14:27    [2840994]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
imagin
Member

Откуда: Москва
Сообщений: 16
тогда удаляется все строки с tp1=1!
4 июл 06, 14:29    [2841009]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
неверю... лог выполнения в студию...
4 июл 06, 14:30    [2841020]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
imagin
тогда удаляется все строки с tp1=1!

Хотите сказать, что в Oracle неправильно вычисляются логические предикаты?
4 июл 06, 14:31    [2841027]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
SQL> 
SQL> WITH t AS
  2       (
  3          SELECT 1 tp1, 2 tp2, 'жел' cd
  4            FROM DUAL
  5          UNION ALL
  6          SELECT 1 tp1, 3 tp2, 'красный' cd
  7            FROM DUAL
  8          UNION ALL
  9          SELECT 1 tp1, 4 tp2, 'зел' cd
 10            FROM DUAL
 11          UNION ALL
 12          SELECT 1 tp1, 2 tp2, 'жел' cd
 13            FROM DUAL
 14          UNION ALL
 15          SELECT 2 tp1, 3 tp2, 'оранж' cd
 16            FROM DUAL
 17          UNION ALL
 18          SELECT 2 tp1, 4 tp2, 'белый' cd
 19            FROM DUAL)
 20  SELECT *
 21    FROM t
 22   WHERE tp1 != 1 OR tp2 NOT IN (2, 4);

       TP1        TP2 CD
---------- ---------- -------
         1          3 красный
         2          3 оранж
         2          4 белый
4 июл 06, 14:36    [2841060]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116252
Proteus
а в чем проблема

select * from <table>
where not(tp1=1 and tp2 in(2,4));

select * from <table>
where tp1!=1 or tp2 not in(2,4));


;)

Замечу, что претензии автора могут оказаться обоснованными

Сравните

select empno, ename, comm from scott.emp
/
      7369	SMITH     	
      7499	ALLEN     	300
      7521	WARD      	500
      7566	JONES     	
      7654	MARTIN    	1400
      7698	BLAKE     	
      7782	CLARK     	
      7788	SCOTT     	
      7839	KING      	
      7844	TURNER    	0
      7876	ADAMS     	
      7900	JAMES     	
      7902	FORD      	
      7934	MILLER    	

select * from scott.emp
where comm not in (10, 20)
/
      7499	ALLEN     	300
      7521	WARD      	500
      7654	MARTIN    	1400
      7844	TURNER    	0
4 июл 06, 14:44    [2841105]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
автор описал данные без пустых значений... но если приведенные данные не являются репрезентативным набором то да... пустые значения на not in отсектся ...
4 июл 06, 14:52    [2841170]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
.
Guest
А если так:
where nvl(comm,0) not in (10, 20)
4 июл 06, 15:02    [2841240]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
M_IV
Member

Откуда:
Сообщений: 1303
WITH t AS
       (
          SELECT 1 tp1, 2 tp2, 't1' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, 3 tp2, 't2' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, 4 tp2, 't3' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, 2 tp2, 't4' cd
            FROM DUAL
          UNION ALL
          SELECT 2 tp1, 3 tp2, 't5' cd
            FROM DUAL
          UNION ALL
          SELECT 2 tp1, 4 tp2, 't6' cd
            FROM DUAL)
  SELECT *
    FROM t
  WHERE tp1||'+'||tp2 NOT IN ('1+2','1+4')
4 июл 06, 15:16    [2841321]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Elic
Member

Откуда:
Сообщений: 29990
.
А если так:
where nvl(comm,0) not in (10, 20)
В общем случае так делать не стоит.
4 июл 06, 15:46    [2841467]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Да и в частном тоже... Ведь неизвестно нужно или нет пустоты включать в выборку ...
а уж эести пошла такая пьянка то
where tp1!=1 or tp2 not in(2,4) or tp2 is null
4 июл 06, 17:47    [2842278]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116252
Proteus
Да и в частном тоже... Ведь неизвестно нужно или нет пустоты включать в выборку ...
а уж эести пошла такая пьянка то
where tp1!=1 or tp2 not in(2,4) or tp2 is null

Рискую навлечь на себя неудовольствие, но с tp1 нужно делать то же самое.

select empno, ename, comm from scott.emp
where comm != 10
/
      7499	ALLEN     	300
      7521	WARDDDD   	500
      7654	MARTIN    	1400
      7844	TURNER    	0
4 июл 06, 18:06    [2842360]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
2dmidek : может и так а может и нет неизвестно... автор вообще в условии задачи ничего не оговорил ни уникальность ни возможность пустых значениний...
4 июл 06, 18:39    [2842517]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116252
Proteus
2dmidek : может и так а может и нет неизвестно... автор вообще в условии задачи ничего не оговорил ни уникальность ни возможность пустых значениний...

Да, это верно, но верно как для tp1, так и для tp2.
ИМХО не надо отдавать предпочтение одному перед другим :-).

Что- то мне подсказывает, что автор с этой проблемой и столкнулся.
Иначе задача вообще ничего не стОит и непонятно, почему с ней возникли трудности.
А вообще-то про NULL- значения всегда надо помнить.
Их поведение при not in и особенно при != еще не является "общим местом".
4 июл 06, 18:49    [2842545]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
согласен на все 100%
4 июл 06, 19:00    [2842590]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
M_IV
Member

Откуда:
Сообщений: 1303
dezhavü:
WITH t AS
       (
          SELECT TO_NUMBER(NULL) tp1, 2 tp2, 't1' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, TO_NUMBER(NULL) tp2, 't2' cd
            FROM DUAL
          UNION ALL
          SELECT TO_NUMBER(NULL) tp1, TO_NUMBER(NULL) tp2, 't2' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, 4 tp2, 't3' cd
            FROM DUAL
          UNION ALL
          SELECT 1 tp1, 2 tp2, 't4' cd
            FROM DUAL
          UNION ALL
          SELECT 2 tp1, 3 tp2, 't5' cd
            FROM DUAL
          UNION ALL
          SELECT 2 tp1, 4 tp2, 't6' cd
            FROM DUAL)
  SELECT *
    FROM t
  WHERE tp1||'+'||tp2 NOT IN ('1+2','1+4')
IMHO: chem proshe, tem luchshe
4 июл 06, 19:03    [2842598]     Ответить | Цитировать Сообщить модератору
 Re: выборка  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116252
M_IV
IMHO: chem proshe, tem luchshe

IMHO на IMHO.
С плюсом мне почему - то не нравится...
Я бы такие вещи делал (и делаю) через NVL.
Просто второе значение надо хорошее подобрать :-)
Когда я увидел сегодня NVL(x,0), я сразу вспомнил свой дебют на ниве использования NVL.
Конечно это был NVL(x,0) и конечно в NOT IN - sub- selecte встречался 0
Моя шефиня чуть не лопнула от смеха ...
4 июл 06, 19:12    [2842623]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить