按属性匹配两个表的行

时间:2017-11-25 20:14:08

标签: postgresql full-text-search plpgsql postgresql-9.3

有没有办法匹配普通PL / pgSQL中的实体? 假设我想通过使用文本搜索查询来搜索客户表中的单个人,该查询比较三个单一属性以识别匹配:

sizeof

但是为每个人这样做有点单调乏味,因为我有一整套人,我想用这种方式匹配。在任何“普通编程语言”的帮助下,我现在循环真正的数组,直到我发现每一行的现有匹配作为一个新表,但有没有办法在普通的PL / pgSQL中做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为PL / PGSQL中的一个函数(类似于Oracle的PL / SQL)与数组相结合作为输入参数可以很好地工作:

CREATE OR REPLACE FUNCTION customers(first_names text[], last_names text[],
    birthdays date[])
  RETURNS SETOF customers_index as
$BODY$
DECLARE
  i integer;
  elements integer;
  rw customers_index%rowtype;
BEGIN

  elements := array_length (first_names);

  for i in 1..elements loop

    for rw in SELECT ci.*
      FROM customers_index ci
      WHERE ci.first_name @@ plainto_tsquery('simple', first_names[i])
        AND ci.last_name @@ plainto_tsquery('simple', last_names[i])
        AND ci.birthdate = birthdays[i]
    loop
      return next rw;
    end loop;
  end loop;

  return;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

实现看起来像这样:

select
  id, first_name, last_name, birthdate
from
  customers(array['John', 'Jane'], array['Smith', 'Doe'], 
      array ['17.08.1967', '16.07.1970'])

如果是课程,假设您的数据来自其他地方,那么实际实施应该看起来更清晰。

另外,我不保证这是超级高效的,但它是从A到B的快速路径,并且有一些GIN索引,或者至少是生日的索引,它实际上可能运行得非常好