Как отдать предпочтение нулевому значению при выборе - PullRequest
1 голос
/ 09 февраля 2020

У меня есть таблица с

Id      value 
1000    null
1000    En
1000    Fr
1000    Es
1001    En
1001    Fr
1001    Es

Вывод запроса выбора должен быть следующим. (Поскольку 1000 имеет только нулевое значение, выберите строку с нулевым значением)

Id      value
1000    null
1001    En
1001    Fr
1001    Es

Ответы [ 4 ]

3 голосов
/ 09 февраля 2020

Вы можете использовать NOT EXISTS и коррелированный подзапрос, чтобы проверить отсутствие NULL для идентификатора. Включите эти строки, а также строки, где value равно NULL.

SELECT t1.id,
       t1.value
       FROM elbat t1
       WHERE NOT EXISTS (SELECT *
                                FROM elbat t2
                                WHERE t2.id = t1.id
                                      AND t2.value IS NULL)
              OR t1.value IS NULL;
2 голосов
/ 09 февраля 2020

В самых последних версиях Oracle вы можете сделать это без подзапроса:

select t.*
from t
order by rank() over (partition by id order by (case when value is null then 1 else 2 end))
fetch first 1 row with ties;

Здесь - это db <> скрипка.

2 голосов
/ 09 февраля 2020
with
  t (id, value) as (
    select 1000, null from dual union all
    select 1000, 'En' from dual union all
    select 1000, 'Fr' from dual union all
    select 1000, 'Es' from dual union all
    select 1001, 'En' from dual union all
    select 1001, 'Fr' from dual union all
    select 1001, 'Es' from dual
  )
select id, value
from   (
         select t.*, 
                dense_rank() over (partition by id order by nvl2(value, 1, 0)) rnk
         from   t
       )
where  rnk = 1
;

        ID VA
---------- --
      1000   
      1001 En
      1001 Fr
      1001 Es

Функции, используемые в этом запросе:

NVL2() https://docs.oracle.com/database/121/SQLRF/functions132.htm#SQLRF00685

DENSE_RANK() https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions043.htm

1 голос
/ 09 февраля 2020

Вы можете использовать analytical function следующим образом:

Select id , value from
(Select t.*,
       Coalesce(Sum(case when value is null then 1 end) over (partition by id), 0) as cnt
 From your_table)
Where (cnt = 1 and value is null)
    or cnt = 0

Ура !!

...