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 04/11/2016 12:12:37

damalaan
Membre

[résolu]-Comparaison de chaine de caractère

Bonjour

Je cherche à faire une comparaison un peu particulière de chaine de caractères.

Une interrogation de la base me renvoie par exemple BIC (que j'ai associé dans une table à une valeur 1), et je veux que le système comprenne que c'est la même que ICB ou CBI ou IBC ou CIB ou BCI et qu'il me renvoie donc la valeur 1.
J'ai pensé faire une association dans une table de toutes les combinaisons possibles, mais je vais avoir des chaines jusqu'à 7 caractères ....., je préfére donc trouver une solution plus propre (à base de regex peut être)

merci de vos bonnes idées !

Dernière modification par damalaan (07/11/2016 09:30:13)

Hors ligne

#2 04/11/2016 17:29:28

dverite
Membre

Re : [résolu]-Comparaison de chaine de caractère

Vous pouvez faire une fonction qui trie par les lettres, et un index fonctionnel sur la table où se trouvent ces chaînes de caractères.
Les comparaisons futures avec cette fonction utiliseront l'index.


Imaginons une fonction qui s'appellerait tri_lettres.

tri_lettres('ICB') = 'BCI' parce que 'B' < 'C' < 'I'
tri_lettres('CBI') = 'BCI' également
...etc... toute permutation des lettres B C et I donnera 'BCI'


Etant donné une chaîne en entrée, une recherche peut se faire avec

SELECT * FROM latable WHERE tri_lettres(nom_colonne) = tri_lettres(chaine_en_entree);

Et pour éviter que le moteur SQL ne réapplique la fonction à toute la table à chaque fois, créer un index:

CREATE INDEX nomindex ON latable(tri_lettres(nom_colonne));

Hors ligne

#3 07/11/2016 09:29:11

damalaan
Membre

Re : [résolu]-Comparaison de chaine de caractère

Je mets ça sous le coude, pour le moment j'ai fait simple en triant systématiquement la sous-requete qui sert à créer la chaine de caractère string_agg, n'étant qu'à l'étape de réflexion du projet, ça fera l'affaire !

select string_agg(t.pln_analyse,'') into lot from (
select pln_analyse from tbl_planif_pln 
where 
pln_producteur = substring(producteur from 7 for 5)::int
and current_date between pln_datedebut and pln_datefin order by pln_analyse) t;

Hors ligne

Pied de page des forums