我有以下表格:
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}]
我需要以这样的方式映射内容:对于表I的每个记录,我能够定义成功匹配的数量。 以上示例的结果将是:
id RID Matches
1 123 2
只有位置0和位置2的内容与记录description
/ additional_info
匹配,因此结果中Matches
为2。
我正在努力将其转换为Postgres中的查询 - 动态SQL在PL / pgSQL函数中创建VIEW
是准确的。
答案 0 :(得分:1)
未定义如何同时处理与 description
和additional_info
匹配的数组元素。我假设你想把它算作1场比赛。
在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'
周围缺少单引号。在将它连接为标识符之前,它仍然是一个字符串文字。您最好在format()
使用%I
。
演示:
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$;