Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
При разработке приложений баз данных я использую очень простую мантру:
если можно, сделай это с помощью одного оператора SQL;
если это нельзя сделать с помощью одного оператора SQL, сделай это в PL/SQL;
если это нельзя сделать в PL/SQL, попытайся использовать хранимую процедуру на языке Java;
если это нельзя сделать в Java, сделай это в виде внешней процедуры на языке C;
если это нельзя реализовать в виде внешней процедуры на языке C, надо серьезно подумать, зачем это вообще делать...
select
coalesce(e.id, d.id),
coalesce(e.name, d.name),
coalesce(e.profession, d.profession),
coalesce(e.votes, d.votes)
from (values (0, 'Полковник', 'кот', null::integer)) d (id, name, profession, votes)
left join election e on e.votes > 10000
order by e.votes desc;
with d (id, name, profession, votes) as (
values (0, 'Полковник', 'кот', null::integer)
)
select
coalesce(e.id, d.id),
coalesce(e.name, d.name),
coalesce(e.profession, d.profession),
coalesce(e.votes, d.votes)
from d
left join election e on e.votes > 8000
order by e.votes desc;
with d as (
select
0 as id,
'Полковник'::text as name,
'кот'::text as profession,
null::integer as votes
)
select
coalesce(e.id, d.id),
coalesce(e.name, d.name),
coalesce(e.profession, d.profession),
coalesce(e.votes, d.votes)
from d
left join election e on e.votes > 8000
order by e.votes desc;
select
coalesce(e.id, d.id) as id,
coalesce(e.name, d.name) as name,
coalesce(e.profession, d.profession) as profession,
coalesce(e.votes, d.votes) as votes
...
select
case when e.tableoid is null then d.id else e.id end as id,
case when e.tableoid is null then d.name else e.name end as name,
case when e.tableoid is null then d.profession else e.profession end as profession,
case when e.tableoid is null then d.votes else e.votes end as votes
...
select j.*
from (select '{"id":0,"name":"Полковник","profession":"кот","votes":null}'::json as j) d
left join election e on e.votes > 10000,
json_populate_record(null::election, case when e.tableoid is null then d.j else row_to_json(e.*) end) j
order by e.votes desc;
select r.*
from (values (0, 'Полковник', 'кот', null::integer)) d
left join election e
on e.votes > 10000,
coalesce(case when e.tableoid is null
then row(d.*)
else row(e.*)
end) r (id integer, name text, profession text, votes integer)
order by e.votes desc;
Oracle, типичные задачи SQL. Гарантированный выбор