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

#1 27/09/2010 11:55:40

Hatem
Membre

recherche multi champs

Bonjour,

je postule ma question et je souhaiterai si quelqu'un peut m'aider,
mon objectif est de lancer une recherche par mot clé sur toutes les tables ainsi leurs champs issus de la base, si un ou pls résultats trouvés il affiche ses enregistrements.


ma fonction recherche n'affiche aucun bug mais par conséquent le résultat est toujours nul.
j'ai pas compris où est le problème

j'exécute ma fonction par la requete exemple je cherche dans toutes tables et dans tous les champs issus un 'service' malgré que dans la base type j'ai déjà instauré ces mots clé correctement !
je serai à votre écoute pour éclaircir la bonne méthode.


select * from rech2('service') as tableau(tab1 int , tab2 varchar) ;
-----------------------------------


voici mon code en PL/PgSQL
-----------------------------------

CREATE OR REPLACE FUNCTION rech2(mot character varying)
  RETURNS SETOF record AS
$BODY$
DECLARE
querysrch record;
req record;
i int ;


BEGIN

FOR querysrch IN SELECT table_name, column_name FROM information_schema.columns
    WHERE table_schema = 'public'  and data_type ilike '%character%'
    LOOP

FOR req IN EXECUTE 'SELECT '|| querysrch.column_name  ||' FROM '|| querysrch.table_name||' WHERE '|| querysrch.column_name ||' = '||'''|| mot || '''||' ;' 
LOOP
;
RETURN NEXT Req;
END LOOP;
END LOOP;
RETURN;   
end;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION rech2(character varying) OWNER TO postgres;


---------------------------------

Cordialement
Hatem

Dernière modification par Hatem (27/09/2010 11:59:10)

Hors ligne

#2 27/09/2010 13:18:08

Marc Cousin
Membre

Re : recherche multi champs

Bonjour,

Pour commencer, vous n'êtes pas obligé de travailler comme vous le faites, colonne par colonne :

Essayez select * from ma_table WHERE ma_table::text ~ 'ma_chaine_a_rechercher'

Cela permet de retourner tous les enregistrements de 'ma_table' contenant 'ma_chaine_a_rechercher'


Marc.

Hors ligne

#3 27/09/2010 13:31:54

Hatem
Membre

Re : recherche multi champs

Bonjour Mr Marc,

sincèrement,  je vous remercie de m'avoir aidé.
Bon travail
je vais reformuler ma fonction
Cordialement
Hatem

Hors ligne

#4 09/11/2010 14:08:50

baradji
Membre

Re : recherche multi champs

Bonjour,
j'aimerai bien savoir si la reponse de Marc Cousin marche chez vous car ça ne marche pas chez moi.j'ai postgresql 8.1
voici l'erreur renvoyé:

ERROR:  syntax error at or near ":"
LINE 1: select * from recherche_mot WHERE recherche_mot:text ~ 'BARK...
                                                       ^
To use type conversion operator (::) turn off the 'Allow using of parameters in query text' option on Tools tab of Environment Options dialog or double colon symbols.

Hors ligne

#5 09/11/2010 14:23:29

Marc Cousin
Membre

Re : recherche multi champs

Il faut deux : consécutifs, pas un seul. C'est un opérateur de cast (conversion), qui demande à transformer tout l'enregistrement en une chaîne de caractères unique.


Marc.

Hors ligne

#6 06/12/2010 12:08:42

unisol
Membre

Re : recherche multi champs

Bonjour,

je rebondi sur ce billet, pour poser une question complementaire.
je souhaite rechercher sur 2 tables 'jointé'

du style :

select * from ma_table inner join ma_2eme_table
on  ma_table.id_ext = ma_2eme_table.id
WHERE
ma_table inner join ma_2eme_table
on  ma_table.id_ext = ma_2eme_table.id ::text ~ 'ma_chaine_a_rechercher'

cela ne marche pas

merci pour vos lumieres

Hors ligne

#7 06/12/2010 12:27:23

gleu
Administrateur

Re : recherche multi champs

Logique, la syntaxe n'est pas respectée. Ceci est au moins valide au niveau de la syntaxe :

select * from ma_table inner join ma_2eme_table
on  ma_table.id_ext = ma_2eme_table.id
WHERE
ma_table.id_ext  ~ 'ma_chaine_a_rechercher'

Pas sûr par contre que ça correspond à ce que vous voulez faire.


Guillaume.

Hors ligne

#8 06/12/2010 14:56:52

Marc Cousin
Membre

Re : recherche multi champs

Non, je pense que ce qui est attendu c'est plutôt :

select * from (select * from ma_table inner join ma_2eme_table
on  ma_table.id_ext = ma_2eme_table.id ) as tmp
WHERE
tmp::text ~ 'ma_chaine_a_rechercher'


Marc.

Hors ligne

Pied de page des forums