8
votes

Comment trier dans SQL, ignorer des articles ('the "," a "," an ", etc.)

Cela revient beaucoup, et je peux voir qu'il est proposé sur Stackoverflow pour xslt , Ruby et drupal mais je ne le vois pas spécifiquement pour SQL.

La question est donc, comment triez-vous correctement les titres lorsqu'ils commencent par "le", "A", ou "A"?

Un moyen de couper () ceux-ci strings: xxx

qui était suggéré sur Askmefi un moment de retour (cela nécessite-t-il que inférieur () fonctionner?) .

Je sais que j'ai également vu une sorte de mise en œuvre de cas / commutateur de cela, mais il est un peu difficile à gérer.

Il y a évidemment un certain nombre de p Solutions ossibles. Que serait bon, c'est que SQL Gurus pèse sur lesquelles ont des implications de performance.


1 commentaires

D'accord avec un commentateur sur l'une des questions liées pour les questions: les règles peuvent se déplacer plus compliquées qu'il n'y parait. Votre suggestion particulière ne ferait probablement pas de trier correctement la liste suivante: Le test A , Le test B , Test .


6 Réponses :


6
votes

Une approche que j'ai vue était d'avoir deux colonnes - une pour l'affichage et l'autre pour le tri: xxx

Je n'ai effectué aucun test réel mondial, mais cela a le bénéfice de pouvoir utiliser un index et ne nécessite pas de manipulation de chaîne chaque fois que vous souhaitez commander par la description. Sauf si votre base de données prend en charge les vues matérialisées (que MySQL ne fonctionne pas), la mise en œuvre de la logique en tant que colonne calculée dans une vue ne fournirait aucun avantage car vous ne pouvez pas indexer la colonne calculée.


0 commentaires

0
votes

Je ne peux parler que pour SQL Server: vous utilisez Ltrim dans les déclarations de cas. Aucune fonction inférieure n'est nécessaire car les sélections ne sont pas sensibles à la casse par défaut. Toutefois, si vous souhaitez ignorer des articles, je vous suggère d'utiliser un dictionnaire Word de bruit et de configurer un catalogue d'indexation de texte complet. Je ne sais pas si d'autres implémentations sont appuyées sur SQL.


3 commentaires

La sensibilité au cas dépend de la collation. La recherche de texte intégral (FTS) est disponible sur MySQL, Oracle, SQL Server ... Dunno Ce que PostgreSQL est, mais je suis sûr qu'il a une fonctionnalité native. Et il y a 3ème fête FTS comme Sphinx ...


"Vous utilisez ltrim dans les déclarations de cas" - Cela signifie-t-il que vous faisons l'équivalent de "si cela commence par" le ", la coupe"? Je me demandais si cela ralentirait le processus, par opposition à une garniture générale () qui pourrait échouer la plupart du temps.


Ltrim se débarrasse des grands espaces



-1
votes

inférieur est nécessaire. Tandis que SELECT n'est pas sensible à la casse, commander par est.


0 commentaires

-3
votes

Essayez ce qui suit:

commander par Remplacer (remplacer (remplacer (YourColumn, 'le' ',' '),' A \ '' ',' '),' AN ',' ')

non testé!


1 commentaires

Surpris Personne n'a expliqué le problème avec cela. Lors du tri, vous souhaitez remplacer les principaux articles, alors que cela remplacera tous les articles.



3
votes

J'utilise cela depuis des années, mais je ne me souviens plus d'où je l'ai trouvé: xxx pré>

céder: p>

TitleSort                  | OriginalTitle
------------------------------------------------------
All About Everything       | All About Everything
Beginning Of The End, The  | The Beginning Of The End
Interesting Story, An      | An Interesting Story
Very Long Story, A         | A Very Long Story


0 commentaires

1
votes

Pour les postgres spécifiquement, vous pouvez utiliser Regexp_replace pour effectuer le travail pour vous:

BEGIN;
CREATE TEMPORARY TABLE book (name VARCHAR NOT NULL) ON COMMIT DROP;
INSERT INTO book (name) VALUES ('The Hitchhiker’s Guide to the Galaxy');
INSERT INTO book (name) VALUES ('The Restaurant at the End of the Universe');
INSERT INTO book (name) VALUES ('Life, the Universe and Everything');
INSERT INTO book (name) VALUES ('So Long, and Thanks for All the Fish');
INSERT INTO book (name) VALUES ('Mostly Harmless');
INSERT INTO book (name) VALUES ('A book by Douglas Adams');
INSERT INTO book (name) VALUES ('Another book by Douglas Adams');
INSERT INTO book (name) VALUES ('An omnibus of books by Douglas Adams');

SELECT name FROM book ORDER BY name;
SELECT name, regexp_replace(lower(name), '^(an?|the) (.*)$', '\2, \1') FROM book ORDER BY 2;
SELECT name FROM book ORDER BY regexp_replace(lower(name), '^(an?|the) (.*)$', '\2, \1');
COMMIT;


0 commentaires