CASE или IF условие в предложении WHERE для нижеследующего требования - PullRequest
0 голосов
/ 11 октября 2018

У меня есть требование ниже, но я не знаю, как написать запрос Oracle SQL для извлечения данных на основе заданного условия.

Требование:

Таблица персон

Name       created_date   updated_date
-------    -----------    ------------
Alex       11-oct-2018     
John       10-oct-2018    11-oct-2018

Я хочу получить имя записи, create_date или updated_date как last_modified_date на основе дат и дат, которые были заданы в пользовательском интерфейсе, и он должен выполнять поиск по updated_date, например updated_date, между fromdate и todate, если updated_date не имеет значение null.если updated_date имеет значение null, то он должен выполнять поиск по методу create_date, например, создан_date, между fromdate и todate

Я пробовал вот так, есть проблемы с компиляцией, я не умею писать

select name,
       case when update_date is null then created_date else updated_date as last_modified_date 
from Person 
where case when updated_date is null 
           then trunc(created_date) between fromdate and todate 
           else trunc(updated_date) between fromdate and todate.'

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы сделали ошибку, чтобы написать правильный синтаксис sql в предложении where, как будет показано ниже

    select name, 
           case when update_date is null 
           then created_date else 
           updated_date end as last_modified_date 
    from Person
    where case when updated_date 
    is null then trunc(created_date)
      else 
    trunc(updated_date) end
    between fromdate and todate

BY с помощью функции COALESCE вы можете сделать то же сравнение

select name,COALESCE(update_date,created_date)
from Person
where COALESCE(update_date,created_date) between fromdate and todate

Вашобласть ошибки

    case when updated_date 
    is null then trunc(created_date) between fromdate and todate --here between is wrong sql syntax (condition)
   else 
    trunc(updated_date) between fromdate and todate --(same thing you did for else)
0 голосов
/ 11 октября 2018

Использование:

CASE WHEN [условие] THEN [return_expr] ELSE [else_expr] END

Select name, 
       CASE WHEN update_date IS NULL
            THEN created_date
            ELSE updated_date END AS last_modified_date
  FROM Person
 WHERE CASE WHEN updated_date IS NULL
            THEN TRUNC(created_date)
            ELSE TRUNC(updated_date) END BETWEEN fromdate AND todate;

или использование только для оракула:

NVL ([expr1], [expr2])

Select name, 
       NVL(update_date, created_date) AS last_modified_date
  FROM Person
 WHERE NVL(updated_date, created_date) BETWEEN fromdate AND todate;
0 голосов
/ 11 октября 2018

Как то так?

select name, nvl(update_date,created_date) as last_modified_date
from Person 
where nvl(update_date,created_date) between fromdate and todate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...