如何使用postgresql与变量类似
我有一个函数,可以进行选择,在这个函数中,我需要使用类似于表达式的变量,但我不知道怎么做。代码如下:如何使用postgresql与变量类似,postgresql,pattern-matching,plpgsql,Postgresql,Pattern Matching,Plpgsql,我有一个函数,可以进行选择,在这个函数中,我需要使用类似于表达式的变量,但我不知道怎么做。代码如下: 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_re
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;
为循环提供信息的查询有三个以上的交叉连接!桌子。我删除了最后两个,因为它们是不需要的。其中一个在循环体中重复。也可以考虑@ KGrITTN关于交叉连接的注释。 在循环体中,您重复地将数据选择到变量中,这没有任何作用。我假设您想要返回这些行——不管怎样,我的编辑版本就是这样做的 我用一个简单的SELECT with重写了循环构造,因为它更快更简单 事实上,我以一种有意义的方式重写了所有内容。您介绍的内容仍然不完整,缺少函数头,语法和逻辑上都很混乱 这是一个有根据的猜测,仅此而已:
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;
如果那样对你有用的话,我需要一张支票
否则,考虑使用的特性。
有些人建议:
您可以在声明时指定一个变量。
关键字DECLARE只需要一次。
使用表别名使代码更易于阅读。
不必将WHERE子句括在括号中。
最有可能的情况是,你不需要更快地完成工作。
我从不使用。喜欢或正则表达式~做得更好。请在此阅读原因:
你还没有真正弄清楚问题是什么。另一方面,SELECT驱动循环没有连接条件,因此您将得到所有表的笛卡尔积——这通常不是人们想要的。您在一个字段中选择了五个值。@kgrittn-pckg_数据可能是一个记录变量只发布plpgsql函数的一个片段没有意义。发布一个完整的函数定义,包括标题,并添加一个说明,说明它的作用,这样我们就可以理解它。运行时您会得到什么?只需从contacts_reg.中选择contacts_reg.id,contactscli_asc,client_reg WHEREcontacts_reg._name与sim_name相似,其中sim_name类似于“%John Smith%”?此函数仍不完整。收割台是不可分割的一部分。没有任何解释,谢谢!我需要知道类似“%”| | | | |的sim_name | | |的语法,但在任何地方都找不到示例!