У меня есть набор данных (десятки столбцов из разных таблиц в разных типах), и я хочу отфильтровать их в зависимости от ввода пользователя.
Итак, у меня есть функция postgress, которая имеет, например,два параметра, один из которых представляет собой массив текста, который будет иметь пользовательский ввод (массив строк), а другой - логический, который указывает, должны ли все они находиться в предложении where или нет в нем.
Первый вопрос:
Что если у нас будет много столбцов для сравнения с ними, тогда у нас будет большое и ужасное условие где!Есть ли другие лучшие варианты, когда мы можем добавить их в большой массив и сравнить два массива вместе или вызвать их из другой функции?
Пример входных данных и какрезультаты должны совпадать:
Ключевые слова: Агент И Марк И 27
Данные: id |положение |имя |возраст
15423 |Агент по недвижимости |Марк Миллер |27 -> 3/3 в должности, имени, возрасте -> ИСТИНА
2754 |Секретный агент |Маркус Смит |43 -> 3/3 в id, позиции, имени -> TRUE
4567 |Агент по недвижимости |Сэм Уилсон |55 -> 1/3 в положении -> FALSE
Функция postgresql:
CREATE OR REPLACE FUNCTION public.filter(
"FilterText" text[],
"trueORFalse" boolean)
RETURNS record AS
$BODY$
select DISTINCT t1.id,
t2.position ,
t3.name ,
t4 age
FROM table1 AS t1
LEFT JOIN table2 AS t2 on t1.id = t2.fk_id
LEFT JOIN table3 AS t3 on t3.fk_id = t2.fk_id
LEFT JOIN table4 AS t4 on t4.fk_id = t3.fk_id
WHERE
t2.position like ANY($1)
-- (AND - OR) depending on the second paramater value $2 ?
t3.name like ANY($1)
-- (AND - OR) depending on the second paramater value $2 ?
t4 age like ANY($1)
$BODY$
LANGUAGE sql STABLE SECURITY DEFINER
COST 100;
ALTER FUNCTION public.filter(text[], boolean)
OWNER TO table_rights_in_functions;
GRANT EXECUTE ON FUNCTION public.filter(text[], boolean) TO public;
GRANT EXECUTE ON FUNCTION public.filter( text[], boolean) TO
table_rights_in_functions;
Наконец, моя версия postgres9,6,8