对类型忽略有效的过滤

时间:2018-09-24 12:43:14

标签: postgresql indexing case filtering where-clause

我有一组数据(来自不同类型的不同表的数十列),我想根据用户的输入进行过滤。

所以我所拥有的是一个postgress函数,例如具有两个参数,一个是文本数组,它将具有用户输入(字符串数组),另一个布尔值则指示是否所有这些文本都应位于内部where子句。

  • 第一个问题是:

    如果我们有很多要与之比较的列,该怎么办呢?还有其他更好的案例吗,我们可以将它们添加到一个大数组中,然后将两个数组进行比较,或者从另一个函数中调用它们?

输入示例以及结果应如何匹配:

关键字:代理商AND Mark AND 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子句中的AND-OR情况?

最后我的postgres版本是9.6.8

1 个答案:

答案 0 :(得分:3)

我发现了这两个魔术函数: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  to_tsvector('simple', f_concat_ws(' ', t2.position,t3.name,t4.age))
  @@ to_tsquery('simple', $2);