Postgres查询计算匹配的字符串

时间:2016-11-01 02:01:18

标签: sql ruby-on-rails postgresql plpgsql dynamic-sql

我有以下表格:

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是准确的。

1 个答案:

答案 0 :(得分:1)

未定义如何同时处理与 descriptionadditional_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;

我使用正则表达式进行匹配。右侧字符串中的特殊字符如(.\?)等具有特殊含义。如果可能的话,你可能不得不逃避这些。

Addressing your comment

您应该已经提到过使用带有EXECUTE的plpgsql函数。可能是2个错误:

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

  2. 字符串'brand_relevance_calculation_‌​view'周围缺少单引号。在将它连接为标识符之前,它仍然是一个字符串文字。您最好在format()使用%I

  3. 演示:

    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$;