Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1