2016-11-12 1 views
1

Я хочу, чтобы иметь возможность возвращать строку none, none, 0, если строка не возвращается из запроса. У меня есть этот SQL:sql - возвращает строку постоянных значений, если строка не существует

select first, last, count(address) 
from employee 
where last in ('james', 'smith', 'hankers') 
group by first, last 
union all 
select 'none', 'none', 0 
from dual 
where not exists (select * from employee where last in ('james', 'smith', 'hankers')); 

из БД, запись для james и smith существует, но запись не существует для hankers.

Но этот запрос возвращается только тогда, когда существует запись. Не возвращается none, none, 0.

Что я здесь делаю неправильно?

EDIT: В этом примере я передаю 3 жестко закодированные значения, как last, но я хотел бы знать, обходным, если мы проходили значения в качестве параметра списка как и (:last) через getJdbcTemplate.

+1

вы можете использовать сверку, как здесь: http://stackoverflow.com/questions/2884996/simple-check-for-select-query-empty-result – aguetat

+0

Какой db вы использовали? – vipin

+0

@vipin Oracle db – qollers

ответ

0

Применяется NOT EXISTS с учетом всех указанных значений. Итак, если любое значение существует, то NOT EXISTS не выполняется.

Как обходное вы можете использовать таблицу в линии с заданными значениями и слева присоединиться к исходной таблице к нему:

select coalesce(t2.first, 'none'), 
     coalesce(t2.last, 'none'), 
     count(t2.address) 
from (
    select 'james' as last 
    union all 
    select 'smith' 
    union all 
    select 'hankers') t1 
left join employee t2 ON t1.last = t2.last 
group by coalesce(t2.first, 'none'), 
     coalesce(t2.last, 'none') 

Если совпадения нет, как это имеет место для last='hankers', затем count(t2.address) оценивается в 0 и возвращает 'none', 'none', 0.

+0

Я вижу. Спасибо. Тем не менее, я должен был уточнить в оригинальной записи, но что было бы обходным путем, если бы мы не знали точный размер «последних» параметров? В этом примере я передаю жестко закодированные 3 значения как 'last', но в моем фактическом SQL я не знаю значений и передаю список paramater, как этот' in (: last); ' – qollers

+0

@qollers Другим обходным решением будет для заполнения таблицы temp всеми значениями. Информация о последних именах должна храниться в некоторой реляционной структуре, если вы хотите ее восстановить. –

0

Может это поможет,

_count NUMBER(10); 

select count(*) into _count 
from employee 
where last in ('james', 'smith', 'hankers'); 

if(_count > 0) 
then 
    select first, last, count(address) c 
    from employee 
    where last in ('james', 'smith', 'hankers') 
    group by first, last 
else 
    select 'none' first, 'none' last, 0 c from dual 
end if 
+0

'_count NUMBER (10);' мы объявляем здесь числовую переменную? Извините, новичок в SQL – qollers

+0

Если вы используете хранимую процедуру для выполнения операций db, вы можете объявлять переменные. – vipin

Смежные вопросы