Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
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
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
Aucune idée pour la locale à sélectionner... s'il en existe une qui fasse ce que vous voulez.
Guillaume.
Hors ligne
Pages : 1