hid*_*ura -2 postgresql plpgsql pattern-matching
我有一个函数,使我需要使用SIMILAR TO带有变量的表达式的选择,我不知道如何做到这一点.这是代码:
DECLARE pckg_data cl_data;
DECLARE contacts contacts_reg%ROWTYPE;
DECLARE sim_name varchar;
BEGIN
SELECT client_reg._name,
client_reg.last_name,
client_reg.id_card,
client_reg.address
INTO pckg_data
FROM client_reg WHERE(client_reg._name = (cl_name ||' '|| cl_lastname));
RETURN NEXT pckg_data;
SELECT ('%'||cl_name || ' ' || cl_lastname ||'%') INTO sim_name;
FOR contacts IN SELECT contacts_reg.id
FROM contacts_reg, contactscli_asc, client_reg
WHERE(contacts_reg._name SIMILAR TO sim_name) LOOP
SELECT client_reg._name, client_reg.last_name, client_reg.id_card,
client_reg.address, client_reg.id
INTO pckg_data
FROM client_reg, contactscli_asc WHERE(contactscli_asc.contact = contacts.id
AND client_reg.id = contactscli_asc.client);
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
您为循环提供的查询有CROSS JOIN超过三个(!)表.我删除了最后两个关于不需要它们的概念.其中一个在循环体中重复出现.还要考虑@ kgrittn的注释CROSS JOIN.
在循环体中,您可以反复将数据选择到变量中,而不会执行任何操作.我假设您想要返回这些行 - 无论如何,这就是我编辑的版本所做的.
我重写了LOOP一个简单的结构SELECT有RETURN QUERY,因为这是更快,更简单.
实际上,我以一种有意义的方式重写了所有内容.你提出的内容仍然是不完整的(缺少函数头),语法和逻辑上一团糟.
这是一个有根据的猜测,不再是:
CREATE FUNCTION very_secret_function_name(cl_name varchar, cl_lastname varchar)
RETURNS TABLE (name varchar, last_name varchar,
id_card int, address varchar, id int) AS
$func$
DECLARE
_sim_name varchar := (cl_name ||' '|| cl_lastname);
BEGIN
RETURN QUERY
SELECT c._name, c.last_name, c.id_card, c.address, NULL::int
-- added NULL for an id to match the second call
FROM client_reg c
WHERE c._name = _sim_name;
RETURN QUERY
SELECT c._name, c.last_name, c.id_card, c.address, r.id
FROM client_reg c
JOIN contactscli_asc a ON a.client = c.id
JOIN contacts_reg r ON r.id = a.contact
WHERE r._name LIKE ('%' || _sim_name || '%');
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
如果那应该适合你,我需要一个precog徽章.:)
否则,请考虑使用的功能.
一些建议:
DECLARE只需要一次.WHERE子句括在括号中.SIMILAR TO并且LIKE更快地完成工作.SIMILAR TO.LIKE或正则表达式(~)做得更好.在这里阅读原因:
| 归档时间: |
|
| 查看次数: |
5667 次 |
| 最近记录: |