Postgres查询来计算匹配的字符串
我有以下表格:
id description additional_info 123 XYZ XYD
和一个数组:
[{It is known to be XYZ},{It is know to be none},{It is know to be XYD}]
我需要以这样的方式映射内容:对于表的每个记录,我能够定义成功匹配的数量。 以上示例的结果将是:
id RID Matches 1 123 2
只有位置0和2的内容与记录的description
/ additional_info
Matches
因此Matches
在结果中为2。
我正在努力将其转换为Postgres中的查询 – 动态SQL以精确地在PL / pgSQL函数中创建VIEW
。
未定义如何处理同时匹配description
和additional_info
数组元素。 我假设你想把它算作一场比赛。
它也是未定义的,其中id = 1
来自结果。
一种方法是unnest()
数组,并将主表LEFT JOIN
连接到两列中任何一列匹配的每个元素:
SELECT 1 AS id, t.id AS "RID", count(a.txt) AS "Matches" FROM tbl t LEFT JOIN unnest(my_arr) AS a(txt) ON a.txt ~ t.description OR a.txt ~ t.additional_info GROUP BY t.id;
我使用正则表达式进行匹配。 右侧字符串中的( .\?
)等特殊字符具有特殊含义。 如果可能的话,你可能不得不逃避这些。
处理你的评论
您应该已经提到过使用带有EXECUTE
的plpgsql函数。 可能有2个错误:
-
变量
array_content
在EXECUTE
不可见,您需要USING
子句传递值 – 或者在CREATE VIEW
语句中将其连接为字符串文字,该语句不允许使用参数。 -
字符串
'brand_relevance_calculation_view'
周围缺少单引号。 在将它连接为标识符之前,它仍然是一个字符串文字。 你在那里使用%I
format()
做得很好。
演示:
DO $do$ DECLARE array_content varchar[]:= '{FREE,DAY}'; BEGIN EXECUTE format(' CREATE VIEW %I AS SELECT id, description, additional_info, name, count(a.text) AS business_objectives , multi_city, category IS NOT NULL AS category FROM initial_events i LEFT JOIN unnest(%L::varchar[]) AS a(text) ON a.text ~ i.description OR a.text ~ i.additional_info' , 'brand_relevance_calculation_view', array_content); END $do$;