Я хочу, чтобы оператор sql IN возвращал ноль, когда запись не найдена - PullRequest
0 голосов
/ 23 июня 2018

Я хочу получить значение null для каждого элемента, если нет совпадения в значении оператора in, например,

SELECT name
FROM table
WHERE id IN (1, 2, 3, 4, 5)

В таком случае я хочуполучить null значение в случае, если IN значение оператора не существует, например, для

IN (1, 2, 3, 4, 5)

Я хочу вернуть значение как

'ABC', null, 'XYZ', null, null

В настоящее время он просто возвращает

'ABC', 'XYZ'

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

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

create tmp_table (name varchar2(32);

и использовать эту процедуру pl / sql:

declare
name_tmp varchar2(32);
for i in (SELECT * FROM table WHERE id IN (1, 2, 3, 4, 5)) loop
SELECT name name_tmp into FROM table id=i.id;
exception when no_data_found then name_tmp := null; end;
insert into tmp_table (name) values (name_tmp) ;
end loop; 
end; 
0 голосов
/ 23 июня 2018

Этот предикат:

WHERE id IN (1, 2, 3, 4, 5)

Может применяться только к строкам, которые существуют в таблице.Так работает предложение WHERE, оно оценивается для существующих строк, и если условия выполняются, эта строка включается в набор результатов запроса.

Предикат не может создавать новые строки, которыене существует в вашей таблице.

Так что нет, вы не можете использовать IN ( ) для вставки пустых строк, где идентификатор отсутствует в вашей таблице.

0 голосов
/ 23 июня 2018

Просто создайте вспомогательную таблицу со всеми значениями:

create table helpTable (uid int);
insert into helpTable values (1),(2),(3),(4),(5);

, а затем left join это и использование оператора case, чтобы определить, должно ли отображаться name, когда есть соответствующее значение (не null):

SELECT case when ht.uid is not null then name end `name`
FROM table t
LEFT JOIN helpTable ht ON t.id = ht.uid;

После того, как вы закончите, DROP TABLE IF EXISTS helpTable;.

Если вы не хотите создавать таблицу, вы можете сделать это (но я не уверен на 100%, что она будет работать):

SELECT case when ht.uid is not null then name end `name`
FROM table t
LEFT JOIN (
    select 1 `uid`
    union all
    select 2
    union all
    select 3
    union all
    select 4
    union all
    select 5
) ht ON t.id = ht.uid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...