如何使用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 | | |的语法,但在任何地方都找不到示例!