PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 27/01/2017 15:38:10

Nom de fonction comme paramètre d'une fonction

Bonjour,

Dans le but de comparer plusieurs algorithmes de pg_similarity, j'ai besoin d'envoyer comme paramètre le nom de la fonction

J'aimerais mettre le sql suivant dans une fonction où jaro pourrait être remplacé par lev ou cosine, etc...

                insert into
                        wrk_simil_compare_methods
                select
                         user_name
                        ,'Company'
                        ,"ContactID"
                        ,jaro("Company", company2cmp)
                        ,'jaro'
                from
                        "tblContacts"
                where
                        jaro("Company", company2cmp) > 0.75;

Est-ce possible en PL/pgSQL ?

Merci pour votre attention,
Mchl

Hors ligne

#2 27/01/2017 15:47:46

rjuju
Administrateur

Re : Nom de fonction comme paramètre d'une fonction

Oui, regardez du côté d'EXECUTE (http://docs.postgresql.fr/9.6/plpgsql-statements.html §41.5.4).

Hors ligne

#3 29/01/2017 14:59:37

Re : Nom de fonction comme paramètre d'une fonction

Merci ! Ca marche

drop table if exists wrk_simil_compare_methods;

create table wrk_simil_compare_methods(
        value1          varchar
        ,value2         varchar
        ,method         varchar
        ,simil_value    double precision
);


create or replace function generic_simil(
                        field_name      varchar
                        ,value2cmp      varchar
                        ,typeofvalue    varchar
                        ,algorithm      varchar
                        ,threshold      decimal
                        ) returns void as $$
begin
        execute
                'insert into wrk_simil_compare_methods select '
                || '''' || field_name || ''','
                || '''' || value2cmp || ''','
                || '''' || algorithm || ''','
                || algorithm || '('
                || '"' || field_name || '",'
                || '''' || value2cmp || '''' || ')'
                || ' from "tblContacts" where '
                || algorithm || '('
                || '"' || field_name || '",'
                || '''' || value2cmp || '''' || ')'
                || ' > ' || threshold;

end; $$ language 'plpgsql';

select generic_simil('Company', 'Dalibo', 'varchar', 'lev', 0.40);
select generic_simil('Company', 'Diolabo', 'varchar', 'lev', 0.40);
select generic_simil('Company', 'Libido', 'varchar', 'cosine', 0.40);
select generic_simil('Company', 'Oracle', 'varchar', 'cosine', 0.40);

select * from wrk_simil_compare_methods;

encore une petite question : le value2cmp pourrait être un nombre. Dans ce cas, il ne faudrait pas le mettre entre '. Comment faire que le script détecte le type de value2cmp et décide de mettre les ' ou non ?

Merci.

Hors ligne

#4 30/01/2017 11:18:11

rjuju
Administrateur

Re : Nom de fonction comme paramètre d'une fonction

Vous pouvez utiliser une variable pour construire votre requête et gérer ça avec un simple IF ... ELSE, ou forcer un cast dans la chaîne construite :

SELECT '1'::integer;
SELECT 'toto'::varchar;

Sinon, je vous conseille d'utiliser la fonction quote_literal() pour éviter toute surprise avec le contenu entrée.

Hors ligne

#5 31/01/2017 15:54:13

Re : Nom de fonction comme paramètre d'une fonction

Merci

Hors ligne

Pied de page des forums