Установка условия в выписке - PullRequest
0 голосов
/ 07 июня 2019

Предположим, есть такая структура таблицы

Name | Class | CS_ex_date | IT_ex_date|

xyz  | CSE   | 10 june    |  Null     |
123  | ECE   | Null       |  Null     |
456  | MECH  | Null       |  Null     |
678  | MECH  | Null       |  Null     |
abc  | IT    | Null       | 3 Aug     |

Я хочу создать оператор выбора с помощью оператора case, а внутри операторов case - некоторые условия.

Я видел обычный синтаксис для операторов case и операторов case в условиях where, но я хочу поместить некоторые условия в часть THEN. У меня проблемы с синтаксисом, и я не могу найти ни одного примера, на который можно ссылаться.

Мой запрос выглядит примерно так:

select * 
  from student 
 where (case 
          when class like '%SE%' 
            then CS_ex_date > sysdate and CS_ex_date < sysdate + 60
          when class like '%T%' 
            then IT_ex_date > sysdate and IT_ex_date < sysdate + 60 
        end);

Я не уверен в синтаксисе моего запроса и получении ORA-00905: отсутствует ключевое слово.

Ожидаемый результат должен быть

Name | Class | CS_ex_date | IT_ex_date|

xyz  | CSE   | 10 june    |  Null    |
abc  | IT    | Null       | 3 Aug    |

Есть ли способ обойти это? Это дает тот же результат, используя любой другой метод.

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Кажется, вы хотите or, а не case:

select * 
  from student 
 where (class like '%SE%' and CS_ex_date > sysdate and CS_ex_date < sysdate + 60) or
       (class like '%T%'  and IT_ex_date > sysdate and IT_ex_date < sysdate + 60)
0 голосов
/ 07 июня 2019

Вы можете использовать оператор CASE для вычисления значения, относящегося к предикату в подзапросе, и затем использовать его в условии WHERE:

with student_dt as
(select 
   student.*,
   case 
          when class like '%SE%' 
            then CS_ex_date  
          when class like '%T%' 
            then IT_ex_date  
        end as check_date
  from student)
select * from  student_dt 
 where check_date > sysdate and check_date < sysdate + 60; 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...