postgresql 如何对变量使用SIMILAR TO

7xllpg7q  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

我有一个带有SELECT的函数,它使用了一个带有变量的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;

字符串

nr9pn0ug

nr9pn0ug1#

你的循环查询有CROSS JOIN超过三个(!)表。我删除了最后两个表,因为它们不需要。其中一个在循环体中重复。也考虑@kgrittn关于CROSS JOIN的注解。
在循环体中,你重复地将数据选择到一个变量中,这 * 什么也不做 *。我假设您希望返回这些行--无论如何,我编辑的版本就是这样做的。
我用一个简单的SELECTRETURN QUERY重写了LOOP结构,因为这样更快更简单。
事实上,我把所有的东西都重写了一遍,以一种有意义的方式。你所展示的仍然是不完整的(缺少函数头),语法和逻辑上都是一团糟。
这是一个受过教育的猜测,没有更多:

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)
  LANGUAGE plpgsql 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$;

字符串
否则,考虑使用的功能。
有人建议:

相关问题