--Создать функцию (ручной вариант coalesce), принимающий 2 аргумента, и возвращающую первый непустой из этих двух аргументов. Функция принимает на вход любые типы данных.

create function cust_coalesce(a1 anyelement, a2 anyelement) returns anyelement

as $$

select 

case 

when a1 is not null 

then a1

else 

a2

end;

$$ language sql;


select 

cust_coalesce(1, 2),

cust_coalesce(null, 3),

cust_coalesce(4, null);


--Создать функцию как в первом пункте, но принимающую 3 параметра.


create function cust_coalesce(a1 anyelement, a2 anyelement, a3 anyelement) returns anyelement

as $$

select 

case 

when a1 is not null then a1

when a2 is not null then a2

else a3

end;

$$ language sql;


select 

cust_coalesce(null, 1, 2),

cust_coalesce(null, 3, null),

cust_coalesce(4, null, null);


--Пересоздать функцию из пункта 2, используя create or replace, добавив в ее тело комментарии, поясняющие логику выполнения.


create or replace function cust_coalesce(a1 anyelement, a2 anyelement, a3 anyelement) returns anyelement

as $$

select 

case 

-- если первый параметр не пустой, о возвращаем его

when a1 is not null then a1

-- если второй не пустой - возвращаем его

when a2 is not null then a2

-- иначе возвращаем третий параметр

else a3

end;

$$ language sql;


--Создать таблицу с одним вещественным полем. Создать процедуру, которая заполняет созданную таблицу случайными вещественными числами от 0 до 1.

--Процедура должна принимать на вход одно целое число - количество элементов, которое надо вставить в таблицу.

--Процедура должна вернуть среднее значение из всех элементов в таблице.


create table g(

g float


select * from g;


create or replace procedure fill_g(in num_el integer, inout avg_val float)

as $$

insert into g

select

random()

from

generate_series(1, num_el);

select

avg(g)

from

g;

$$ language sql;


call fill_g(10, null);


select * from g;


--* Создать процедуру, которая будет наполнять таблицу rental новыми записями.

--Принимает параметры:

--- nm integer - число строк, которое нужно добавить

--- dt date default null - дата rental_date, за которую нужно добавить новые записи. Если дата не задана, то находим максимальную существующую дату rental_date в таблице rental и прибавляем к ней один день.

--Компакт диски для сдачи выбираем случайным образом.



create procedure fill_rent(nm integer, dt date default null)

as $$

insert into rental (

rental_date, 

inventory_id, 

customer_id, 

return_date, 

staff_id

)

select

subquery.rental_date,

subquery.inventory_id,

subquery.customer_id,

subquery.rental_date + (

select

f.rental_duration 

from

film f

join inventory i using (film_id)

where 

i.inventory_id = subquery.inventory_id

) as return_date,

subquery.staff_id

from

(

select

coalesce(dt, (select max(rental_date)::date + 1 from rental)) rental_date, 

(

select

floor(rand.rand * count(*)) + 1 

from

inventory

) inventory_id, 

(

select

floor(rand.rand * count(*)) + 1 

from

customer

) customer_id, 

(

select

floor(rand.rand * count(*)) + 1 

from

staff

) staff_id

from

(

select 

random() rand

from

generate_series(1, nm)

) rand

) subquery;

$$ language sql;



call fill_rent(10, null);


Last modified: Sunday, 3 July 2022, 6:13 AM