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

未定义如何处理同时匹配descriptionadditional_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个错误:

  1. 变量array_contentEXECUTE不可见,您需要USING子句传递值 – 或者在CREATE VIEW语句中将其连接为字符串文字,该语句不允许使用参数。

  2. 字符串'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$; 
Interesting Posts