2017-07-06 1 views
-1

J'ai une table appelée Mots-clés que 100 de mots-clés allant d'un mot à plusieurs, tous séparés par des virgules. Par exemple:Comment faire correspondre les mots partiels dans une chaîne - TSQL

change of name, asb, repair, reporting violence 

Ces mots-clés sont regroupés en catégories.

Nous avons des utilisateurs qui peuvent entrer n'importe quel texte dans un champ de texte libre. Exemple:

Caller rang to to speak to ASB about violence 

Comment utiliser SQL pour lire les mots dans le champ de texte libre afin de rechercher des correspondances dans le tableau de mots clés? Donc, dans l'exemple ci-dessus, je veux qu'il ramasse ASB et Violence a été stocké dans la table Mot-clé.

Je voudrais aussi qu'il ramène un résultat si seulement un mot a été utilisé comme ASB.

Il est important de noter que n'importe quel mot peut être entré dans le champ de texte libre. J'utilise Microsoft SQL Server 2014 SP2.

Merci

+0

Quelle version du serveur SQL utilisez-vous? – w0051977

+0

Salut, Microsoft SQL Server 2014 SP2 – user114790

+0

Je voudrais utiliser un catalogue de texte intégral et en lire plus à ce sujet. MS recommande quand vous commencez à entrer dans beaucoup de recherche de texte pour le faire de cette façon. Si vous ne le faites que pour quelques choses et une petite base de données, c'est probablement correct. Mais à la fin, si c'est pour une partie centrale complète d'une application, c'est un ensemble plus complet destiné à ce type d'opération. Aussi, vous pouvez faire des recherches similaires comme vélo = vélo et vice versa. https://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/ – djangojazz

Répondre

0

Comme vous ne l'avez pas spécifié vos noms de table; Je vais en créer. S'il vous plaît lancer ceci:

create table dbWords (id int not null identity, words varchar(100), primary key (id)) 
insert into dbWords (words) values ('change of name, asb, repair, reporting violence') 

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
ENd 

Lancez ensuite ceci:

select * from dbWords inner join (
select * from dbo.fnSplitString('change of name, change of dob', ',') 
) as splitdatatable on dbwords.words like '%,' + splitdata+ ',%' 
or dbwords.words like '%,' + splitdata 
or dbwords.words like splitdata + ',%' 

Le texte est passé à la fonction dans l'instruction SQL ci-dessus est le texte saisi par l'utilisateur.

+0

Salut, j'ai Microsoft SQL Server 2014 SP2. Ref la structure - je lis les données d'une table et une colonne qui renvoie plusieurs lignes. Chaque ligne a une liste de mots-clés séparés par une virgule – user114790

+0

@ user114790, s'il vous plaît poster la structure de votre table – w0051977

+0

@ user114790, j'ai édité ma réponse maintenant je sais que vous utilisez SQL Server 2014. – w0051977