-2

変数で式を使用する必要がある選択を行う関数があり、その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;
4

1 に答える 1

10

ループにフィードするクエリにはCROSS JOIN、3つ(!)を超えるテーブルがあります。最後の2つは必要ないという考えで削除しました。それらの1つは、ループの本体で繰り返されます。に関する@kgrittnのメモも考慮してくださいCROSS JOIN

ループの本体では、データを変数に繰り返し選択しますが、これは何もしません。私はあなたがそれらの行を返したいと思います-とにかく、それは私の編集されたバージョンがすることです。

LOOPで構成を書き直しました。これは、はるかに高速で単純だからですSELECTRETURN 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;

それがあなたのために働くべきであるならば、私はprecogバッジを要求します。:)
それ以外の場合は、使用されている機能を検討してください。

いくつかのアドバイス:

于 2012-08-17T00:47:57.007 に答える