有没有办法匹配普通PL / pgSQL中的实体? 假设我想通过使用文本搜索查询来搜索客户表中的单个人,该查询比较三个单一属性以识别匹配:
sizeof
但是为每个人这样做有点单调乏味,因为我有一整套人,我想用这种方式匹配。在任何“普通编程语言”的帮助下,我现在循环真正的数组,直到我发现每一行的现有匹配作为一个新表,但有没有办法在普通的PL / pgSQL中做到这一点?
答案 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索引,或者至少是生日的索引,它实际上可能运行得非常好