2010-03-11 6 views
1

Je vais commencer par dire que je ne pense pas que ce que je veux puisse être fait, mais cela dit, j'espère que je me trompe et que quelqu'un en sait plus que moi. Alors voici votre chance ... Prouvez que vous êtes plus intelligent que moi :)Sélectionner une déclaration avec plusieurs champs 'where' utilisant la même valeur sans dupliquer le texte

Je veux faire une recherche sur une table SQLite à la recherche d'enregistrements qui sont "similaires" sans avoir à écrire la requête dans une main longue.

Pour clarifier ce comment je sais que je peux écrire la requête:

select * from Articles where title like '%Bla%' or category like '%Bla%' or post like '%Bla%' 

Cela fonctionne et n'est pas une affaire énorme si vous vérifiez que contre deux colonnes, mais si vous devez vérifier contre un tas alors votre requête peut devenir vraiment longue et méchant à la recherche vraiment rapide, sans parler de la chance pour les fautes de frappe. (c'est-à-dire: 'Bla%' au lieu de '% Bla%')

Ce que je me demande, c'est s'il y a un moyen court de le faire?

* Ce code suivant ne fonctionne pas comme je veux, mais montre à peu près ce que je cherche

select * from Articles where title or category or post like '%Bla%' 

Quelqu'un sait s'il y a un moyen de préciser que plusieurs « où » colonnes doivent utiliser la même valeur de recherche sans indiquer la même valeur de recherche pour chaque colonne?

Merci d'avance!

+0

Juste au cas où vous ne saviez pas déjà, des recherches 'LIKE « % Bla% »' déposerons scan à chaque fois (regardez chaque rangée dans le tableau de haut en bas). Comme votre nombre de rangées augmente, vous sentirez la douleur! –

Répondre

4

Je pense que si vous utilisez sqlite, vous devriez envisager d'utiliser la recherche plein texte. Cela rendra ce que vous essayez de faire plus efficace.

http://www.sqlite.org/cvstrac/wiki?p=FtsUsage

+1

C'est encore mieux que ce que je cherchais! Merci! – kdbdallas

+0

Un problème que je viens de trouver avec ceci en essayant de l'implémenter, est que vous ne pouvez pas avoir d'index sur la table (en dehors de la recherche en texte intégral). ("articleID"); Cela donne l'erreur: "Les tables virtuelles ne sont peut-être pas indexées" Cela signifie qu'en accélérant la recherche en texte intégral, cela ralentira toutes mes requêtes normales car il faudra effectuer une analyse de table complète. hrm. Les requêtes normales seront plus importantes (dans mon cas) donc malheureusement je ne pense pas que cela fonctionnera pour moi .... – kdbdallas

0

Le plus rapide chose que je peux penser, est de concaténer titre, la catégorie et après, et voir si les matchs de chaîne concaténée de l'% Bla%. Pour que cela fonctionne de manière fiable, utilisez un séparateur comme ',' lors de la concaténation (sinon, vous pourriez avoir le titre 'Bl' et la catégorie 'a').

Je ne sais pas du haut de ma tête, ce que l'opérateur de concaténation est appelé en SQL, et je ne suis pas sûr, s'il existe en SQL ou SQLite générique.

Mon idée est que cela pourrait ressembler à:

select * from Articles where concat(title, ',', category, ',', post) like '%Bla%' 
+0

Ici, vous allez: 'title || '-' || catégorie || '-' || Post comme '% Bla%' ' –

0

Peut-être que vous voulez concaténer vos champs en une seule chaîne et alors comme contre cela?

select * from Articles where (title || ';' || category || ';' || post) like '%Bla%' 

Les points-virgules entre les deux sont arbitraires et sont là pour veiller à ce que « ROB » et « lance » ne rapportent pas un faux positif.

Si vous voulez ne pas avoir à fournir les champs du tout, ce qui est un plus compliqué ... un

+0

Assez curieusement, j'ai juste recherché l'opérateur de concaténation pour SQLlite, et c'est un double tuyau. Cela rend mon exemple inutilement confus, peut-être. – LesterDove

+0

Choisissez un meilleur délimiteur. Et je vote pour la réponse de Nissan de toute façon. – LesterDove

Questions connexes