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

Откуда: Одесса
Сообщений: 655
Есть таблица dataset с полем FIELD

Я хочу выбрать значение из набора данных и поместить его в переменную.
select FIELD into val
from dataset
where FIELD = <ЗНАЧЕНИЕ>

Если в наборе оказалась запись с заданным ЗНАЧЕНИЕ, в переменную val сохраниться ЗНАЧЕНИЕ.
Но если в наборе не оказалось записи с заданным ЗНАЧЕНИЕ
( select count(*) from dataset -- Результат 0 )
, возникает исключение, т.к. выборка ничего не возвращает.

Кто нибудь знает как в одном запросе учесть факт пустого набора и заполнить переменную нулё например. Т.е. я не хочу сначала делать проверку select count(*) into cnt from dataset, а затем проверять переменную cnt на нуль, а одним запросом получить значение либо нуль в случае отсутствия записей?
13 сен 07, 14:06    [4662781]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
уже обсуждалось...
Например, использовать курсор - OPEN - FETCH - CLOSE
13 сен 07, 14:09    [4662808]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
declare
  x varchar2(100);
  y varchar2(100);
  z varchar2(100);
  w varchar2(100);
  cursor c_z is select dummy into x from dual where 1=1;
begin
  begin
    select dummy into x from dual where 1=1;
  exception
    when others then
      x := null;
  end;

  select max(dummy) into y from dual where 1=1;
   
  open c_z
  fetch c_z into x;
  if c_z%notfound then z := null;
  close c_z;

  w := null;
  for i in (select dummy from dual where 1=1) loop
    w := i.dummy;
    exit;
  end loop;
end;
 
13 сен 07, 14:12    [4662829]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Очепятко вкралось...
13 сен 07, 14:13    [4662836]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Elic
Member

Откуда:
Сообщений: 29979
andrey_anonymous
Очепятко вкралось...
Не только. Но и обучение нехорошему.
13 сен 07, 14:15    [4662855]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Elic
andrey_anonymous
Очепятко вкралось...
Не только. Но и обучение нехорошему.

может это и ест очепятко :)
13 сен 07, 14:17    [4662891]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Brodiaga
Member

Откуда:
Сообщений: 501
Proteus
Elic
andrey_anonymous
Очепятко вкралось...
Не только. Но и обучение нехорошему.

может это и ест очепятко :)


+1
13 сен 07, 14:21    [4662926]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
andrey_anonymous
Очепятко вкралось...
Не только. Но и обучение нехорошему.

Ну дык ить нехорошему и сами научатся - жизнь все расставит по местам... когда-нибудь :)
А очепятко - "end if;" пропустил :)
13 сен 07, 14:23    [4662937]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Brodiaga
Member

Откуда:
Сообщений: 501
andrey_anonymous

  cursor c_z is select dummy into x from dual where 1=1;

 


Вот это помоему тоже не хороше
13 сен 07, 14:25    [4662958]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
Я было придумал конструкцию
         
       select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then FIELD
            end as FIELD
            
            from dataset
            where FIELD = <ЗНАЧЕНИЕ>


При такой конструкции требуется еще
group by FIELD в конце.
Получается
         
       select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then FIELD
            end as FIELD
            
            from dataset
            where FIELD = <ЗНАЧЕНИЕ>
            group by FIELD
,
Так можно узнать FIELD, если оно нашлось, а вот если нет count(*) = 0, но group by FIELD его прячет, поскольку нечего группировать.

На первый взгляд заманчивое простое решение не оправдало себя и вызывает волну разочарования.

С курсорами чтото пугающе, лучше уж проверять в начале количество, а затем if-ом анализировать его.
13 сен 07, 14:26    [4662967]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
Может я что-то не додумал, может кто-то решил эту задачу.
13 сен 07, 14:33    [4663019]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Elic
Member

Откуда:
Сообщений: 29979
Brodiaga
Proteus
Elic
andrey_anonymous
Очепятко вкралось...
Не только. Но и обучение нехорошему.
может это и ест очепятко :)
+1
-1000
OTHERS
13 сен 07, 14:36    [4663037]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
А почему с курсорами что-то пугающее?
13 сен 07, 14:36    [4663040]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Elic
-1000
OTHERS

я имел ввиду именно это
end if не заметил.
13 сен 07, 14:41    [4663074]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
xymbo
А почему с курсорами что-то пугающее?

На первый взгляд громоздко, может разобраться надо с курсорами, тогда и видно будет.
13 сен 07, 14:44    [4663110]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
OTHERS

Оопс, это я действительно лопухнулся как надо.
Ведь помню, что писал "no_data_found", откуда там others...
Пошел рыдать в подушку :)
13 сен 07, 14:45    [4663120]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Rangil
xymbo
А почему с курсорами что-то пугающее?

На первый взгляд громоздко, может разобраться надо с курсорами, тогда и видно будет.


Разобраться по любому надо...
13 сен 07, 14:56    [4663236]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
Я составил одним запросом, но помоему, что в лоб что полбу - что с if-ом, что вот так

    

  select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then (select op_id 
                                                            from dataset 
                                                             where FIELD = <ЗНАЧЕНИЕ> )

            end as FIELD

       select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then 1
            end as FIELD
            
            from dataset
            where FIELD = <ЗНАЧЕНИЕ>
13 сен 07, 15:20    [4663506]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
Ошибушка, вот так
    

  select 
            case 
                 when avail = 0 then 0
                 when avail = 1 then (select op_id 
                                                            from dataset 
                                                             where FIELD = <ЗНАЧЕНИЕ> )

            end as FIELD

       select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then 1
            end as avail
            
            from dataset
            where FIELD = <ЗНАЧЕНИЕ>
13 сен 07, 15:21    [4663520]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
Rangil
Ошибушка, вот так


Давайте еще раз. С третьей попытки должно пойти
13 сен 07, 15:25    [4663570]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Rangil
Member

Откуда: Одесса
Сообщений: 655
dmidek
Rangil
Ошибушка, вот так


Давайте еще раз. С третьей попытки должно пойти


select 
            case 
                 when avail = 0 then 0
                 when avail = 1 then (select FIELD
                                                            from dataset 
                                                             where FIELD = <ЗНАЧЕНИЕ> )

            end as FIELD
from    
   select 
            case 
                 when count(*) = 0 then 0
                 when count(*) = 1 then 1
            end as avail
            
            from dataset
            where FIELD = <ЗНАЧЕНИЕ>
Пример не рабочий, а только схема, но понять суть можно
Неудобство, когда блок where большой. Т.к. он повторяется два раза.
13 сен 07, 15:31    [4663649]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
Elic
Member

Откуда:
Сообщений: 29979
Rangil
Пример не рабочий, а только схема
Учиться, учиться и ещё раз учиться
select case when exists (select ...) then <ЗНАЧЕНИЕ> else 0 end into ... from dual;
13 сен 07, 15:35    [4663708]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
можно глупый вопрос?

Так не короче?
DECLARE
  var1  varchar2(100);

  CURSOR Cur1 IS
     SELECT fld1
     FROM tab1 
     WHERE ...;
BEGIN
   OPEN Cur1;
   FETCH Cur1 INTO var1;
   CLOSE Cur1;
END;
13 сен 07, 15:36    [4663716]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Rangil
Пример не рабочий

Все, рыдать в подушку сил больше нет
Схема-схемой, а как дела с обоснованием целесообразности такой монструозной конструляции?
13 сен 07, 15:36    [4663719]     Ответить | Цитировать Сообщить модератору
 Re: Два в одном: проверка существования и выборка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
tru55
можно глупый вопрос?

https://www.sql.ru/forum/actualthread.aspx?tid=473313#4662829
13 сен 07, 15:37    [4663728]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить