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 14/01/2013 11:47:04

ruizsebastien
Membre

ORDER BY sur colonne de type text

Bonjour,

J'ai une table avec un champ de type text (pas xml) qui contient des données du style :
<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">CA942 - Centre d'appels de Paris</Title></root>

Je voudrais faire un order by sur ce champ mais je voudrais qu'il ne trie qu'à partir de " - Centre d'appels...." et qu'il ignore le début.


Cordialement,

Sébastien.

Hors ligne

#2 14/01/2013 13:01:25

gleu
Administrateur

Re : ORDER BY sur colonne de type text

Enlever les X premiers caractères avec substr ? si c'est plus complexe, utiliser une expression rationnelle pour ne récupérer que la partie qui vous intéresse ?


Guillaume.

Hors ligne

#3 14/01/2013 15:53:57

ruizsebastien
Membre

Re : ORDER BY sur colonne de type text

Avec cette requête j’obtiens presque le bon tri :

select title FROM test.AssetEntry
WHERE (visible = true) AND ( AssetEntry.classTypeId = 11577)
AND (AssetEntry.groupId = 11070 OR AssetEntry.groupId = 11070 )
AND (AssetEntry.classNameId = 10108)
ORDER BY substring(title from 126) ASC;  -- j’ignore les 126 premiers caractères.



Et pourtant, non.... on voit bien que les sections ne sont pas bien triées :

"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD93 - Section de Seine Saint-Denis à Bondy</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD05 - Section des Hautes-Alpes à Gap</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD65 - Section des Hautes-Pyrénées à Tarbes</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD92 - Section des Hauts de Seine à Boulogne-Billancourt</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD40 - Section des Landes à Mont-de-Marsan</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD64 - Section des Pyrénées-Atlantiques à Biarritz</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD66 - Section des Pyrénées-Orientales à Perpignan</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD88 - Section des Vosges à Épinal</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD78 - Section des Yvelines à Montigny le Bretonneux</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD84 - Section de Vaucluse à Avignon</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD85 - Section de Vendée à La Roche-sur-Yon</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD35 - Section d'Ille et Vilaine à Rennes</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD37 - Section d'Indre et Loire à Tours</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD67 - Section du Bas-Rhin à Strasbourg</Title></root>"
"<?xml version='1.0' encoding='UTF-8'?><root available-locales="fr_FR" default-locale="fr_FR"><Title language-id="fr_FR">SD14 - Section du Calvados à Herouville-Saint-Clair</Title></root>"


Cordialement,

Sébastien.

Hors ligne

#4 14/01/2013 16:50:09

ruizsebastien
Membre

Re : ORDER BY sur colonne de type text

A priori, ça devrait être bon comme ça :
(prise en compte des espaces et des apostrophes dans le tri en ne prenant en compte que le texte à partir de " - ")

select title FROM AssetEntry
WHERE (visible = true) AND ( AssetEntry.classTypeId = 11577)
AND (AssetEntry.groupId = 11070 OR AssetEntry.groupId = 11070 )
AND (AssetEntry.classNameId = 10108)
ORDER BY substring(translate(title, ' ''', '11') from length(split_part(title,' - ',1))+1) ASC;


Cordialement,

Sébastien.

Hors ligne

#5 23/01/2013 10:24:27

ruizsebastien
Membre

Re : ORDER BY sur colonne de type text

Le problème vient de la collation (fr_FR.utf8) : dans ce cas postgresql ignore les espaces dans les tris. Ce n'est pas terrible comme façon de trier... est-ce normal ?
Et puis choisir une autre collation pourrait avoir des effets de bords sur le tri des mots accentués par exemple...


Cordialement,

Sébastien.

Hors ligne

#6 23/01/2013 11:02:26

gleu
Administrateur

Re : ORDER BY sur colonne de type text

PostgreSQL ne trie pas directement les données. Il fait appel à une fonction système qui les trie suivant la collation indiquée. Donc si problème il y a, c'est au niveau du système d'exploitation.


Guillaume.

Hors ligne

#7 23/01/2013 16:07:11

ruizsebastien
Membre

Re : ORDER BY sur colonne de type text

Quelle locale (française) faut-il choisir pour que le tri prenne en compte les espaces (pour une base encodée en UTF8) ?

select collcollate from pg_collation where collcollate like 'fr_%';

"fr_BE.utf8"
"fr_BE"
"fr_BE.iso88591"
"fr_BE.iso885915@euro"
"fr_BE.utf8"
"fr_BE@euro"
"fr_CA.utf8"
"fr_CA"
"fr_CA.iso88591"
"fr_CA.utf8"
"fr_CH.utf8"
"fr_CH"
"fr_CH.iso88591"
"fr_CH.utf8"
"fr_FR.utf8"
"fr_FR"
"fr_FR.iso88591"
"fr_FR.iso885915@euro"
"fr_FR.utf8"
"fr_FR@euro"
"fr_LU.utf8"
"fr_LU"
"fr_LU.iso88591"
"fr_LU.iso885915@euro"
"fr_LU.utf8"
"fr_LU@euro"
"french"

Les locales que j'ai testé génère cette erreur :
createdb: database creation failed: ERROR:  encoding UTF8 does not match locale fr_FR.iso885915@euro
DETAIL:  The chosen LC_CTYPE setting requires encoding LATIN9.


Cordialement,

Sébastien.

Hors ligne

#8 25/01/2013 00:03:48

gleu
Administrateur

Re : ORDER BY sur colonne de type text

Aucune idée pour la locale à sélectionner... s'il en existe une qui fasse ce que vous voulez.


Guillaume.

Hors ligne

Pied de page des forums