Честно говоря, у меня нет большого опыта работы с postgres и sql.
Я пытаюсь создать функцию с динамическими c именами таблиц и столбцов, используя EXECUTE FORMAT (... ) запрос. Но все, что я пробовал, FORMAT не учитывает значения, предоставленные для аргументов типа, таких как% s и% I. И поиск в Google не помог из-за отсутствия полезной информации. Я видел много примеров, и мой код не отличается от примеров, но не работает. Я сделал скрипку здесь -> db-fiddle
Вот мой DDL-код:
CREATE TABLE IF NOT EXISTS tbl (
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL
);
CREATE FUNCTION occurences_number(varchar, varchar) RETURNS integer AS '
DECLARE
text varchar := LOWER($1);
str varchar := LOWER($2);
BEGIN
RETURN (CHAR_LENGTH(text) - CHAR_LENGTH(REPLACE(text, str, " "))) / CHAR_LENGTH(str);
END; '
LANGUAGE PLPGSQL;
CREATE FUNCTION records_with_string(regclass, varchar, varchar)
RETURNS integer AS '
DECLARE
result integer;
tbl ALIAS FOR $1;
col ALIAS FOR $2;
str ALIAS FOR $3;
BEGIN
EXECUTE format("SELECT COUNT(*) FROM %I WHERE occurences_number(%I, %s) > 0", tbl::varchar, col::varchar, str::varchar)
INTO result;
RETURN result;
END; '
LANGUAGE PLPGSQL;
И вот запрос:
INSERT INTO tbl VALUES ('a', 'aaa bbb ccc ddd'), ('b', 'aaa bbb'), ('c', 'ccc ddd'), ('d', 'aaa ccc ddd'), ('e', 'aaa bbb ccc ddd eee');
SELECT "records_with_string"('tbl'::regclass, 'last_name', 'eee') FROM tbl;
Результат запроса:
Ошибка запроса: ошибка: столбец «SELECT COUNT (*) FROM% I WHERE occurences_number (% I,% s)> 0» не существует
Что я делаю не так?
ОБНОВЛЕНИЕ db-fiddle не принимает $$