Эффективная фильтрация по типу игнорирования - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть набор данных (десятки столбцов из разных таблиц в разных типах), и я хочу отфильтровать их в зависимости от ввода пользователя.

Итак, у меня есть функция 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;
  • Другой вопрос:

    Как добавить условие CASE WHEN, чтобы проверить второй параметр для определения случаев И - ИЛИ внутри предложения where?

Наконец, моя версия postgres9,6,8

1 Ответ

0 голосов
/ 27 сентября 2018

Я нашел эти две магические функции: to_tsvector, to_tsquery, которые сравнивают два массива строк и для управления текстовым поиском.Дополнительная информация: https://www.postgresql.org/docs/9.6/static/textsearch-controls.html

, например,

нам нужно создать новую функцию:

  CREATE OR REPLACE FUNCTION f_concat_ws(text, VARIADIC text[])
  RETURNS text LANGUAGE sql IMMUTABLE AS 'SELECT array_to_string($2, $1)';

, затем в предложении where:

  WHERE  to_tsvector('simple', f_concat_ws(' ', t2.position,t3.name,t4.age))
  @@ to_tsquery('simple', $2); 
...