我有一组数据(来自不同类型的不同表的数十列),我想根据用户的输入进行过滤。
所以我所拥有的是一个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
答案 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);