MYSQL: выбрать дату из таблицы, когда условие A удовлетворяет; если дата равна нулю, выберите дату из условия B - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь выбрать DATE_VALUE из таблицы ISO_DATE, когда DATE_QUAL_CD=EFFD.Если указанная выше дата равна нулю или нет записи с DATE_QUAL_CD=EFFD, верните DATE_VALUE, где DATE_QUAL_CD=PRIM. Я пробовал ниже:

SELECT ISOD.DATE_VALUE
FROM ISO_DATE ISOD
WHERE
(
 (ISOD.DATE_QUAL_CD ='EFFD' AND ISOD.DATE_VALUE IS NOT NULL)
 OR
 (ISOD.DATE_QUAL_CD ='PRIM'
 AND EXISTS (SELECT 1 FROM ISO_DATE INNERISOD
              WHERE INNERISOD.DATE_QUAL_CD ='EFFD'
              AND INNERISOD.DATE_VALUE IS NULL
              AND ISOD.DATE_ID = INNERISOD.DATE_ID
              )
  )
 )

1 Ответ

1 голос
/ 22 мая 2019

Как насчет ранжирования строк по DATE_QUAL_CD?

В этом примере EFFD существует, поэтому возвращается DATE_VALUE (100):

SQL> with iso_date (date_value, date_qual_cd) as
  2    (select 100, 'EFFD' from dual union all
  3     select 200, 'PRIM' from dual union all
  4     select 300, 'XXXX' from dual
  5    ),
  6  temp as
  7    (select date_value,
  8         date_qual_cd,
  9         rank() over (order by case when date_qual_cd = 'EFFD' then 1
 10                                    when date_qual_cd = 'PRIM' then 2
 11                                    else 3
 12                               end) rn
 13     from iso_date
 14    )
 15  select date_value
 16  from temp
 17  where rn = 1;

DATE_VALUE
----------
       100

SQL>

В этом примере EFFD не существует, поэтому PRIM 's DATE_VALUE (200) возвращается:

SQL> with iso_date (date_value, date_qual_cd) as
  2    (select 100, 'ABCD' from dual union all
  3     select 200, 'PRIM' from dual union all
  4     select 300, 'XXXX' from dual
  5    ),
  6  temp as
  7    (select date_value,
  8         date_qual_cd,
  9         rank() over (order by case when date_qual_cd = 'EFFD' then 1
 10                                    when date_qual_cd = 'PRIM' then 2
 11                                    else 3
 12                               end) rn
 13     from iso_date
 14    )
 15  select date_value
 16  from temp
 17  where rn = 1;

DATE_VALUE
----------
       200

SQL>

Если не существует ни одного из EFFD или PRIM, приведенный выше запрос вернет все строки .Вы не сказали, что делать в этом случае, так что пока - вот что вы получаете.

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