2011-09-30 4 views
0

Dans notre cas, nous sommes limités à SQL Server 2000.procédure stockée SQL - Rechercher un tableau de chaînes dans un champ et afficher le nombre d'occurrences

Disons que nous avons une table « Articles » avec un champ " ArticleText ". Comment chercher une chaîne composée de plusieurs mots et retourner le nombre d'occurrences trouvées.

Un exemple d'une chaîne de recherche: John est un gentil garçon (il contient 5 mots)

ID ArticleText       Result 
1 John is going to learn    2 
2 John is doing his homework nice-ly 3 
3 John is a nice boy     5 

Jusqu'à maintenant, je l'ai trouvé un split function pour le serveur SQL 2000 pour délimiter la recherche chaîne. Maintenant, j'essaie de parcourir les dossiers et d'afficher le nombre de mots trouvés dans un champ, mais je me suis coincé. De l'aide?

Répondre

1

SQL Server 2000 solution

idée nouvelle. Essayez de diviser la chaîne de recherche d'abord en 1 table temporaire. Rejoindre ensuite les articles en utilisant des jokers. J'ai testé cela sur SQL Server 2008 R2 en mode de compatibilité 2000.

Les 2 conditions de jointure s'assurent qu'il correspond au premier mot ou à n'importe quel début de mots (pour obtenir 'gentil'). Vous devriez ajuster cela à vos besoins et envisager de remplacer les fonctions du trait d'union et d'autres signes de ponctuation.

+0

@Gazmend: L'erreur "There is already an ..." est un comportement normal. Vous devez d'abord laisser tomber la table. J'ai édité la réponse ci-dessus. –

1

solution SQL Server 2008

Vous utilisez croix appliquer, qui passe chaque valeur d'une table dans la fonction et rejoint le résultat.

SELECT a.ID, a.ArticleText, COUNT(*) as [Result] 
FROM Articles as a 
CROSS APPLY dbo.Split(a.ArticleText,' ') as S 
WHERE S.Data IN ('John','is','a','nice','boy') 
GROUP BY a.ID, a.ArticleText 

Fait intéressant, si vous êtes de passage dans le texte comme une seule chaîne, ce qui est plus probable lorsque vous remplacez le texte par exemple. Vous pouvez également utiliser la fonction Split pour cela. «John est un gentil garçon» d'un paramètre de procédure ou d'une variable locale.

SELECT a.ID, a.ArticleText, COUNT(*) as [Result] 
FROM Articles as a 
CROSS APPLY dbo.Split(a.ArticleText,' ') as S 
WHERE S.Data IN (SELECT Data FROM dbo.Split(@Search,' ')) 
GROUP BY a.ID, a.ArticleText 
+0

Merci Rusell, mais il ne fonctionnera pas avec sql server 2000. Il donne l'erreur: Ligne 3: Syntaxe incorrecte près de 'APPLY'. –

+0

Oui, cela ne s'appliquerait qu'à 2005+. C'était une limitation en 2000 et une solution de contournement impliquerait probablement SQL dynamique ou le curseur redouté. Avez-vous envisagé une recherche en texte intégral? C'est à ce moment que votre cas d'utilisation détaillé en bénéficierait. –

0

Rusell, Merci beaucoup.

Maintenant, j'ai eu un problème avec le #S "Il y a déjà un objet nommé '#S' dans la base de données."

et aussi avec le:

SELECT * INTO @tblWords FROM dbo.Split(@Search, ' '); 

Mais tant pis, je fixe, donc j'envoie le code qui fonctionne dans SQL 2000.

declare @Search varchar(100) 
set @Search = 'John is a nice boy' 

DECLARE @tblWords TABLE(IDArray int, ArrayValue VARCHAR(500)) 
INSERT INTO @tblWords (IDArray, ArrayValue) SELECT * FROM [dbo].[Split] (@Search, ' ') 

SELECT IDArticle, ArticleText, COUNT(*) as [Result] FROM @tblWords 
    JOIN Articles on ArticleText like ArrayValue + ' %' 
    OR ArticleText like '% ' + ArrayValue + '%' 
     GROUP BY IDArticle, ArticleText 
     Order by Result desc 

Pour ceux qui veulent essayer cela, voici le code de table:

CREATE TABLE [Articles] (
    [IDArticle] [int] IDENTITY (1, 1) NOT NULL , 
    [ArticleText] [varchar] (500) 

Merci encore Rusell, je vous dois un café.

Questions connexes