2010-08-31 6 views
3

J'utilise MS SQL 2008 et je suis face à un défi pour quelques jours est maintenant. Mon paramètre SP peut contenir un à trois mots dans une chaîne (nvarchar) et je dois retourner LIKE %phrase% enregistrements correspondants pour chaque mot d'une chaîne.serveur SQL 2008 multiple « LIKE » problème

Exemple. Mon paramètre est:

"stack overflow" 

Les documents qui doivent être Returnd:

miSTACKon 
noOVERFLOWon 
STACKit 
poOWERFLOW 
STACK 
OWERFLOW 

I a également examiné FTS mais CONTIENT fonction prend un seul caractère générique à la fin de la phrase (chaque)

phrase* 

Existe-t-il une solution à ce problème autre que le SQL dynamique?

+0

Qu'est-ce que vous obtenez lorsque vous utilisez: 'CONTAINS (votre_colonne, '' pile '' OU '' débordement '') '? –

+0

@OMG Poneys: Je n'ai que des correspondances exactes. Avec CONTAINS je peux utiliser '*' mais seulement à la fin de chaque phrase. – Leon

+0

Le problème avec la tentative d'application de FTS ici est que l'analyse/indexation FTS est basée sur un mot lorsque vous essayez de faire correspondre des motifs de caractères dans des mots. –

Répondre

6

Commencez par l'exemple générique puis je vais en moquer avec quelques « ELCA syndicales »

select distinct Record from dbo.Records 
    inner join dbo.Split('stack overflow', ' ') tokens 
     on records_table.Record like '%' + tokens.value + '%' 

donc ce que je faisais ci-dessous est i moquaient des données qui sont les « dossiers, ainsi qu'une maquette . revenir de la fonction dbo.Split, essentiellement une table de varchars avec 'pile' et 'débordement' sur tokenizé ''

select distinct Name from (
select 'stack' as Name 
union all 
select 'nope' as Name 
union all 
select ' stackoverflow' as Name 
    ) records_table 
    inner join (
    select 'stack' as value 
    union all 
    select 'overflow' as value) tokens 
    on records_table.Name like '%' + tokens.value + '%' 

Résultats:

stack 
stackoverflow 

Il n'y a rien de spécial à propos de la fonction dbo.Split et il y a des tonnes d'exemples d'implémentation là-bas ...

+0

Ma fonction de partage favorite est [ici] (http://www.mssqltips.com/tip.asp?tip=1665). –

+0

Cela résout en fait une plus grande partie de mon problème. Merci pour ça. Avez-vous une idée de comment trier les résultats par pertinence? Je pense à partir de match (s) parfait (s) vers le bas. Je suppose que ma fonction de Split devrait prendre soin de cela en quelque sorte ... – Leon

+0

que signifie la pertinence? Vous pouvez retourner une table avec la valeur "split" et un classement? puis commandez par là. Elaborer un peu plus et je vais y réfléchir. – Nix

0

Vous pouvez transmettre les 'mots' avec un caractère délimiteur fixe (ie, ',', '|', etc.) qui n'est pas nécessaire pour les 'mots' possibles (que vous supportez), alors analyser cet argument avec une fonction table, et enfin joindre l'ensemble des mots avec une condition JOIN similaire à LIKE '%' + word + '%'.