SQL - отображать строку, если параметр существует, иначе отображать другой параметр, если существует - PullRequest
1 голос
/ 11 октября 2011

У меня есть таблица, подобная следующей:

ID  |INFO     | DATE_DT
-------------------------
1091|info5    |10/10/2010
1239|old.info |14/09/2010
1340|old.info |07/10/2010
3481|info     |16/10/2010
4134|info3    |21/01/2011

Я хотел бы отобразить только одну строку со следующими условиями:
- если у меня в таблице одна строка с INFO = 'info' --> показать только эту строку
- если у меня нет одной строки с INFO = 'info', поэтому я -> отобразить строку с INFO = 'old.info' и DATE_DT = MAX(DATE_DT)

так, в моем примере, если моя таблицаэто:

ID  |INFO     | DATE_DT
-------------------------
1091|info5    |10/10/2010
1239|old.info |14/09/2010
1340|old.info |07/10/2010
3481|info     |16/10/2010 ===> display this row
4134|info3    |21/01/2011

или если моя таблица не содержит INFO = 'info'

ID  |INFO     | DATE_DT
-------------------------
1091|info5    |10/10/2010
1239|old.info |14/09/2010
1340|old.info |07/10/2010 ===> display this row
4134|info3    |21/01/2011

какие-либо предложения?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Вы можете выбрать обе строки и взять по приоритету ту, которая удовлетворяет первому условию:

SQL> WITH my_table AS (
  2  SELECT 1091 id, 'info5' info, to_date('10/10/2010') date_dt FROM DUAL
  3  UNION ALL SELECT 1239, 'old.info' , to_date('14/09/2010') FROM DUAL
  4  UNION ALL SELECT 1340, 'old.info' , to_date('07/10/2010') FROM DUAL
  5  UNION ALL SELECT 3481, 'info'     , to_date('16/10/2010') FROM DUAL
  6  UNION ALL SELECT 4134, 'info3'    , to_date('21/01/2011') FROM DUAL)
  7  SELECT * FROM (
  8     SELECT 1 ord, t.*
  9       FROM my_table t
 10      WHERE info = 'info'
 11     UNION ALL
 12     SELECT 2 ord, t.*
 13       FROM my_table t
 14      WHERE date_dt = (SELECT MAX(date_dt) FROM my_table)
 15     ORDER BY ord)
 16   WHERE ROWNUM = 1;

       ORD         ID INFO     DATE_DT
---------- ---------- -------- -----------
         1       3481 info     16/10/2010

Если вы удалите строку 'info', будет выбрана строка, в которой будет DATE_DT = MAX(DATE_DT):

SQL> WITH my_table AS (
  2  SELECT 1091 id, 'info5' info, to_date('10/10/2010') date_dt FROM DUAL
  3  UNION ALL SELECT 1239, 'old.info' , to_date('14/09/2010') FROM DUAL
  4  UNION ALL SELECT 1340, 'old.info' , to_date('07/10/2010') FROM DUAL
  5  /*UNION ALL SELECT 3481, 'info'     , to_date('16/10/2010') FROM DUAL*/
  6  UNION ALL SELECT 4134, 'info3'    , to_date('21/01/2011') FROM DUAL)
  7  SELECT * FROM (
  8     SELECT 1 ord, t.*
  9       FROM my_table t
 10      WHERE info = 'info'
 11     UNION ALL
 12     SELECT 2 ord, t.*
 13       FROM my_table t
 14      WHERE date_dt = (SELECT MAX(date_dt) FROM my_table)
 15     ORDER BY ord)
 16   WHERE ROWNUM = 1;

       ORD         ID INFO     DATE_DT
---------- ---------- -------- -----------
         2       4134 info3    21/01/2011
2 голосов
/ 11 октября 2011

Вы также можете сделать это с аналитическими функциями , чтобы потребовать только один проход по данным:

with my_tab as (
select 1091 as id, 'info5' as info, to_date('10/10/2010',' DD/MM/YYYY') as date_dt from dual
union all select 1239, 'old.info', to_date('14/09/2010', 'DD/MM/YYYY') from dual
union all select 1340, 'old.info', to_date('07/10/2010', 'DD/MM/YYYY') from dual
union all select 3481, 'info', to_date('16/10/2010', 'DD/MM/YYYY') from dual
union all select 4134, 'info3', to_date('21/01/2011', 'DD/MM/YYYY') from dual
)
select id, info, to_char(date_dt, 'DD/MM/YYYY')
from (
    select id, info, date_dt, rank() over (order by ord, date_dt desc) as rnk
    from (
        select id, info, date_dt,
            case info
                when 'info' then 1
                when 'old.info' then 2
                when 'info3' then 3
                else null
            end as ord
        from my_tab
    )
)
where rnk = 1;

        ID INFO     DATE_DT
---------- -------- ----------
      3481 info     16/10/2010

Выбив строку 'info', вы получите:

        ID INFO     DATE_DT
---------- -------- ----------
      1340 old.info 07/10/2010

Вероятно, не лучше, чем у @ Vincent для этого тривиального случая, но с большим количеством данных и большим количеством значений, которые можно выбрать, это может лучше масштабироваться - просто нужно больше ord значений в этом случае, хотя с любыми реальными данными, которые у меня были быдумал, что ты найдешь приоритет из другой таблицы ...

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