Vous n'êtes pas identifié(e).
Pages : 1
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
Oui, regardez du côté d'EXECUTE (http://docs.postgresql.fr/9.6/plpgsql-statements.html §41.5.4).
Julien.
https://rjuju.github.io/
Hors ligne
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
Merci
Hors ligne
Pages : 1