J'ai besoin d'une sélection qui retournerait des résultats comme celui-ci:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
Et j'ai besoin de tous les résultats, c'est-à-dire que cela inclut des chaînes avec «mot2 mot3 mot1» ou «mot1 mot3 mot2» ou toute autre combinaison des trois.
Tous les mots doivent être dans le résultat.
word3 word2 word1
.Notez que si vous utilisez
LIKE
pour déterminer si une chaîne est une sous-chaîne d'une autre chaîne, vous devez échapper les caractères de correspondance de modèle dans votre chaîne de recherche.Si votre dialecte SQL le prend en charge
CHARINDEX
, il est beaucoup plus facile de l'utiliser à la place:En outre, veuillez garder à l'esprit que cela et la méthode dans la réponse acceptée ne couvrent que la correspondance de sous-chaîne plutôt que la correspondance de mots. Ainsi, par exemple, la chaîne
'word1word2word3'
correspondrait toujours.la source
InStr()
placeCHARINDEX
Une fonction
Requete
la source
Au lieu de
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
, ajoutez Et entre ces mots comme:pour plus de détails, voir ici https://msdn.microsoft.com/en-us/library/ms187787.aspx
MISE À JOUR
Pour sélectionner des phrases, utilisez des guillemets doubles comme:
ps vous devez d'abord activer la recherche en texte intégral sur la table avant d'utiliser contient le mot-clé. pour plus de détails, voir ici https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search
la source
Modifié
OR
enAND
fonction de la modification de la question.la source
Si vous utilisez Oracle Database, vous pouvez y parvenir à l'aide de la requête contient . Contient des requêtes plus rapides qu'une requête similaire.
Si vous avez besoin de tous les mots
Si vous avez besoin de l'un des mots
Contient l'index de besoin de type CONTEXT sur votre colonne.
la source
Si vous voulez juste trouver un match.
Serveur SQL :
Pour obtenir une correspondance exacte. L'exemple
(';a;ab;ac;',';b;')
n'obtiendra pas de correspondance.la source
essayez d'utiliser la «recherche tesarus» dans l'index de texte intégral dans MS SQL Server. C'est bien mieux que d'utiliser "%" dans la recherche si vous avez des millions d'enregistrements. tesarus a une petite quantité de mémoire que les autres. essayez de rechercher ces fonctions :)
la source
la meilleure façon est de créer un index de texte intégral sur une colonne de la table et d'utiliser contain au lieu de LIKE
la source
pourquoi ne pas utiliser "in" à la place?
la source
L'un des moyens les plus simples d'atteindre ce qui est mentionné dans la question est d'utiliser CONTAINS avec NEAR ou '~'. Par exemple, les requêtes suivantes nous donneraient toutes les colonnes qui incluent spécifiquement word1, word2 et word3.
De plus, CONTAINSTABLE renvoie un classement pour chaque document en fonction de la proximité de "mot1", "mot2" et "mot3". Par exemple, si un document contient la phrase «Le mot1 est le mot2 et le mot3», son classement serait élevé car les termes sont plus proches les uns des autres que dans d'autres documents.
Une autre chose que je voudrais ajouter est que nous pouvons également utiliser proximite_term pour trouver des colonnes où les mots sont à l'intérieur d'une distance spécifique entre eux à l'intérieur de l'expression de colonne.
la source
Idéalement, cela devrait être fait à l'aide de la recherche en texte intégral du serveur SQL si vous utilisez. Cependant, si vous ne pouvez pas faire fonctionner cela sur votre base de données pour une raison quelconque, voici une solution exigeante en performances: -
la source
Cela affichera tous les enregistrements
column1
contenant une valeur partielleword
.la source
la source
ou
la source