12
votes

Comment puis-je régler une requête SQLite Ignorer des articles ("le", "A", etc.)?

J'utilise C # pour afficher une liste de titres de films que j'appelle à partir d'une base de données SQLite. Actuellement, j'utilise une classe Listbox personnalisée qui a une fonction pour trier le texte en décapant le mot "le" du début de chaque article. Cependant, il ne semble pas exactement le moyen le plus simple de le faire, car il appelle la base de données SQLite et alors tricheurs. Je préférerais le couper à une seule étape, espérons trier directement de la base de données dans ma requête "Select".

J'ai fait des recherches sur cela et j'ai trouvé des suggestions, notamment de créer une colonne de tri supplémentaire par la base de données. Bien que ce soit certainement une possibilité, je me demande s'il existe des options plus simples qui ne nécessitent pas d'insertion d'informations doublantes presque identiques (surtout si la base de données devient plus grande). Je suis assez nouveau à SQLite, mais j'ai lu quelque chose à propos de la création d'une fonction d'assemblage pouvant être utilisée pour créer une commande personnalisée. Cependant, je ne suis pas sûr que cela soit utilisé pour cela et je ne peux pas sembler trouver de l'aide pour la mettre en œuvre en C #.

espérant que quelqu'un pourrait être capable de partager des conseils. Si une colonne de tri supplémentaire est la meilleure façon d'aller, c'est ce que je ferai.


0 commentaires

6 Réponses :


6
votes

Pour éviter d'insérer des données en double, qu'en est-il d'avoir deux colonnes: titre_prefix (généralement vide, mais contient parfois "le", ou "A"; aucun index sur cette colonne) et le titre (contient le titre sans "The" ou " A "; c'est la colonne que vous créez l'index sur). Pour afficher les données, vous devez combiner titre_prefix et titre. Mais vous venez de chercher sur le titre.


0 commentaires

1
votes

Vous pouvez stocker chaque titre en 2 parties: titre et préfixe .

avec sqlite Vous pouvez combiner 2 valeurs de chaîne via le || Opérateur également appelé opérateur de concaténate .

Voici un exemple: xxx

Vous pouvez également utiliser < Code> ltrim dans le préficiel de case est vide, vous n'avez donc pas de place à l'avant: xxx


Une autre alternative consiste à stocker le préfixe à la fin du titre. Par exemple, dans beaucoup de magasins de films, vous verrez quelque chose comme:

trois mousquetaires, le


0 commentaires

0
votes

dans le code C # strong>

Si vous vouliez faire cela dans C #, utilisez LINQ pour effectuer la commande pour vous. J'ai posté un échantillon complet sur Pastebin . Cela vous permettra de: P>

  • Évitez de faire dupliquer les données dans votre base de données li>
  • Profitez des index de DB comme vous le feriez normalement, peu importe les RDBMS LI>
  • Mettez des mots de bruit dans un fichier de configuration, réduisant ainsi les temps d'arrêt / reconstruction / redéployez lors de la modification de la liste LI>
  • Assurez-vous qu'une solution est plus lisible dans votre code client LI> ul> xxx pré>

    dans votre instruction SQLite forte> p>

    Que diriez-vous de simplement remplacer les mots de bruit avec des blancs dans l'ordre? C'est une première étape laid, mais considérons fermement une nouvelle colonne pour stocker cette valeur à des fins de tri. P> xxx pré>

    Certes, cela devient laid quand vous vous retrouvez avec ceci: P >

    REPLACE(REPLACE(REPLACE(REPLACE([title],'The ',''),'a',''),'of',''),'by','')
    


4 commentaires

Cela ne permettra pas à la base de données d'utiliser un index sur titre si on existe. Et on dirait que l'OP s'attend à beaucoup de données.


@Daniel: En effet, vous avez raison sur l'index. Pour High Perf, OP pourrait vouloir trouver un autre dB à part de SQLite. La solution C # est beaucoup plus attrayante. Le tri appartient vraiment au client, peu importe la SGDBR.


@downvoter: SOINS Pour expliquer pourquoi le tri en utilisant Linq n'aide pas? Que diriez-vous de la suggestion d'une nouvelle colonne pour stocker la valeur «tri»? Comment l'une de ces suggestions a-t-elle obtenu un bowvote?


L'utilisation de la fonction Remplacer () ne fonctionne pas, en particulier avec 'A'. Vous remplacerez toute la lettre A avec rien. Signification "Apple" devient "Pple", probablement pas ce que tu voulais.



0
votes

Vous pouvez essayer de construire une table prenant en charge la recherche en texte intégral (à l'aide du FTS module ) sur le titre. Ensuite, vous pourrez effectuer des recherches rapides sur tous les mots du titre sans avoir besoin de beaucoup de travail supplémentaire de votre part. Par exemple, une requête d'utilisateur de bonne mauvaise laidule pourrait produire "le bien, le mauvais et le laid" comme l'un de ses premiers résultats. Le coût supplémentaire de tout cela représente environ un quart de la durée du texte en général, mais pourrait être plus pour votre jeu de données, car les titres ne sont pas du texte anglais complet. Vous devez également passer le temps à construire ces indices supplémentaires - vous ne voulez pas les construire sur votre ensemble de données principal sur un système en direct (évidemment) - mais cela ne devrait pas être trop gros problème.


0 commentaires

0
votes

Créer une colonne virtuelle (résultat d'une fonction pouvant être implémentée dans C #) et trier sur cette colonne virtuelle. La fonction pourrait déplacer "le" à la fin comme dans "trois mousquetaires, le" ou le défausse "Le", tout ce que vous voulez faire.


3 commentaires

Il y a une documentation sur la façon de faire cela quelque part sur le site System.Data.Sqlite. Les sortes seraient effectuées dans votre instruction SELECT dans SQLite, bien que vous abandonniez l'accès à l'index sur le tri. Je suppose que vous n'avez pas de milliers et de milliers de titres dans vos Resultats si vous les mettez dans une liste de liste maintenant, ce qui ne devrait pas être un problème.


Voici un exemple de ce que je veux dire:


ivankrisianto.com/software-Development/visual-studio-net/...



5
votes

Voici la solution:

ORDER BY (CASE 
    WHEN sortTitle LIKE 'the %' THEN substr(sortTitle,5) 
    WHEN sortTitle LIKE 'a %' THEN substr(sortTitle,3) 
    WHEN sortTitle LIKE 'an %' THEN substr(sortTitle,4) 
    ELSE sortTitle END)


1 commentaires

N'oubliez pas que vos utilisateurs peuvent utiliser une langue autre que l'anglais.