Files
dc-project/src/main/resources/sql/functions/citizen/find_citizens.sql

51 lines
1.3 KiB
PL/PgSQL

create or replace function find_citizens(
search text default null,
direction text default 'desc',
sort text default 'created_at',
"limit" int default 50,
"offset" int default 0,
out resource json,
out total int
) language plpgsql as
$$
begin
select json_agg(t) into resource
from (
select
z.*,
find_user_by_id(z.user_id) as "user"
from citizen as z
where "search" is null or (
(name->'first_name')::text ilike '%'||"search"||'%' or
(name->'last_name')::text ilike '%'||"search"||'%'
)
order by
case direction when 'asc' then
case sort
when 'name' then (z.name->'first_name')::text
when 'created_at' then z.created_at::text
else null
end
end,
case direction when 'desc' then
case sort
when 'name' then (z.name->'first_name')::text
when 'created_at' then z.created_at::text
end
end
desc,
z.created_at desc
limit "limit" offset "offset"
) as t;
select count(id) into total
from citizen
where "search" is null or (
(name->'first_name')::text ilike '%'||"search"||'%' or
(name->'last_name')::text ilike '%'||"search"||'%'
);
end;
$$;