Как поставить настраиваемое значение, когда записи не выбираются в случае, когда с помощью SQL ORACLE? - PullRequest
0 голосов
/ 20 ноября 2018

Предположим, у меня есть две таблицы Table1 и Table2, а данные приведены ниже: Table1

Id
__
id1
id2
id3
id4
id5

Table2

Id  rank
--  ---
Id1 1
Id2 2

Теперь я хочу сделать orcale SQL-запрос, которыйвозвращает, как показано ниже:

Id  rank
--  ---
Id1 1
Id2 2
Id3 0
Id4 0
Id5 0

Я сделал следующий SQL, но он не возвращает желаемый результат.

SELECT TAB1.ID,(SELECT CASE
    WHEN TAB2.RANK IS NULL THEN TAB2.RANK
    ELSE 0
    END FROM TABLE2 TAB2 WHERE  TAB2.ID=TAB1.ID) as RANK FROM TABLE1 TAB1;

Возвращает, как показано ниже:

Id  rank
--  ---
Id1 1
Id2 2
Id3 null
Id4 null
Id5 null

Ответы [ 6 ]

0 голосов
/ 13 апреля 2019

это будет работать:

select a.id,case when b.rank is not null then
b.rank else 0 end
from 
table1 a,table2 b where
a.id=b.id;
0 голосов
/ 20 ноября 2018

Остальные ответы верны, и если столбец id уникален, я определенно так и сделаю.

Однако, чтобы объяснить, как делать то, что вы хотите, используя скалярный подзапрос,сначала нужно выполнить скалярный подзапрос, а затем решить, что делать с результатами, чтобы он выглядел примерно так:

select id,
       case when rank is null then 0 else rank end rank1,
       coalesce (rank, 0) rank2,
       nvl (rank, 0) rank3
from   (select tab1.id,
               (select tab2.rank from table2 tab2 where tab2.id = tab1.id) rank
        from   table1 tab1);

Примечание: я дал вам 3 способа получения ранга, который выпосле:

  • CASE - это нормально для использования, но немного многословно.
  • COALESCE - возвращает первое ненулевое значение в списке предоставленных параметров
  • NVL - это нормально использовать в этой ситуации, поскольку второе значение является константой.Однако NVL всегда оценивает оба параметра, независимо от того, нужен он или нет.Если второй параметр является функцией, он будет запускаться каждый раз, даже если первый параметр не равен нулю.И CASE, и COALESCE будут выполнять логическое короткое замыкание, то есть они остановятся при первом условии, которое оценивается как истинное.

В общем, мой предпочтительный вариант - использовать COALESCE.

0 голосов
/ 20 ноября 2018

Как насчет использования coalesce() и left join?

select t1.id, coalesce(t2.rank, 0) as rank
from table1 t1 left join
     table2 t2
     on t1.id = t2.id
0 голосов
/ 20 ноября 2018

использовать функцию coalesce ()

SELECT TAB1.ID,coalesce((SELECT CASE
    WHEN TAB2.RANK IS NULL THEN TAB2.RANK
    ELSE 0
    END FROM TABLE2 TAB2 WHERE  TAB2.ID=TAB1.ID),0) as RANK FROM TABLE1 TAB1;
0 голосов
/ 20 ноября 2018

Должно быть простое соединение слева:

SELECT tab1.id, coalesce(tab2.rank,0) as rank
FROM tab1
LEFT JOIN tab2 ON tab1.id = tab2.id
0 голосов
/ 20 ноября 2018

использовать левое соединение и coalesce().coalesce () возвращает 1-е ненулевое значение, поэтому, если id не совпадает, возвращается 0

 select t1.id,coalesce(t2.rank,0)
 from table1 t1
 left join table2 t2
 on t1.id=t2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...