2 результаты, вытекающие из директивы case

#sql #oracle #plsql

Вопрос:

Почему в этом запросе я получаю два результата, используя регистр? Я думал, что после выполнения первого условия следует перерыв, а второе вообще не проверяется

 select KOD from ap_magazyny mag where 1 =
    case 
    when (value1 like 'ZZ%' and mag.KOD like (select SUBSTR(value1,INSTR(value1,'/',1) 1,3) from dual)) then 1
    when (atrybut_t01 = value2 AND rownum = 1) then 1
    else 0
    end
 

Результат, как
введите описание изображения здесь

Комментарии:

1. У вас есть две строки, соответствующие условиям. В чем же проблема?

2. дело работает на уровне столбца.

3. Возможно ли разбить инструкцию case после соответствия первому условию ?

4. Это два отдельных кода, которые соответствуют условию ZG0 и ZG1

5. @GeorgeJoseph В дате, как select KOD from ap_magazyny mag where 1 = case when (atrybut_t01 = 5902596218362 AND rownum = 1) then 1 when ('ZZT/ZG1/00023/07/2021' like 'ZZ%' and mag.KOD like (select SUBSTR('ZZT/ZG1/00023/07/2021',INSTR('ZZT/ZG1/00023/07/2021','/',1) 1,3) from dual)) then 1 else 0 end только 1 значение совпадения в первом условии его ZG1

Ответ №1:

Я надеюсь, что мой пример поможет:

 with cte as (select case when id = 1 then
                       1
                  else 
                       2
                  end A 
           from test
           where rownum = 1) 
select *
from  test
join cte on test.id = cte.A
 

Вам нужно будет подключить его к чему-то, потому что 1 всегда будет 1, и вы получите все результаты из табличного теста.

ДЕМОНСТРАЦИЯ

Ответ №2:

Вы можете использовать rownum=1 для ограничения результатов.

 select * from (
    select KOD 
      from ap_magazyny mag 
     where 1 = case when (value1 like 'ZZ%' 
                         and mag.KOD like (select SUBSTR(value1,INSTR(value1,'/',1) 1,3) 
                                             from dual)
                                           ) then 1
                    when (atrybut_t01 = value2 AND rownum = 1) then 1
                    else 0
               end
    order by case when (value1 like 'ZZ%' 
                         and mag.KOD like (select SUBSTR(value1,INSTR(value1,'/',1) 1,3) 
                                             from dual)
                                           ) then 1
                    when (atrybut_t01 = value2 AND rownum = 1) then 2
               end
)x
where rownum=1
 

Комментарии:

1. Используя rownum, он получает случайный результат в зависимости от того, какой результат база данных помещает сверху. К сожалению, порядок результатов не соответствует порядку обращения

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

3. обновлен ответ, который будет упорядочен по условиям, которые выполняются в первую очередь