=>CREATE OR REPLACE FUNCTIONauthor_name(last_name text, first_name text, middle_name text)RETURNStextAS $$
SELECT last_name || ' ' ||
left(first_name,1) || '.' ||
CASE WHEN middle_name !=''-- подразумевает NOT NULLTHEN' ' || left(middle_name,1) || '.'ELSE''END;
$$ IMMUTABLE LANGUAGE sql;
CREATE FUNCTION
=>CREATE OR REPLACE VIEW authors_v ASSELECT a.author_id,author_name(a.last_name, a.first_name, a.middle_name)AS display_name
FROM authors a
ORDER BY display_name;
CREATE VIEW
Функция book_name
=>CREATE OR REPLACE FUNCTIONbook_name(book_id integer, title text)RETURNStextAS $$
SELECT title || '. ' ||
string_agg(author_name(a.last_name, a.first_name, a.middle_name),', 'ORDER BY ash.seq_num)FROM authors a
JOIN authorship ash ON a.author_id = ash.author_id
WHERE ash.book_id = book_name.book_id;
$$ STABLE LANGUAGE sql;
CREATE FUNCTION
=>DROP VIEW IF EXISTS catalog_v;
DROP VIEW
=>CREATE VIEW catalog_v ASSELECT b.book_id,book_name(b.book_id, b.title)AS display_name
FROM books b
ORDER BY display_name;