2010-02-22 4 views
2

Comment puis-je rechercher un enregistrement qui a une certaine entrée de texte de la part de l'utilisateur?Requête SQL pour rechercher un enregistrement contenant un certain texte?

Par exemple, dans ma table fonction de l'adaptateur:

SELECT Word, Description, Example 
FROM WordLists 
WHERE (Word LIKE @SearchKey OR Description LIKE @SearchKey OR Example LIKE @SearchKey) 

Il est évident que seul enregistrement qui a le texte exact de certaines entrées seront acquises de la DB. Ce que je dois faire est d'obtenir tous les enregistrements qui contiennent des textes d'entrée de l'utilisateur.

Répondre

7
SELECT Word, Description, Example 
FROM WordLists 
WHERE ((Word LIKE '%' + @SearchKey + '%') 
    OR (Description LIKE '%' + @SearchKey + '%') 
    OR (Example LIKE '%' + @SearchKey +'%')) 
+0

Merci Monsieur ... Ensoleillé – hisoka21

1

Une autre option est la suivante:

SELECT Word, Description, Example 
FROM WordLists 
WHERE (Word || ' ' || Description || ' ' || Example) LIKE ('%' + @SearchKey + '%') 

Cela peut (ou non) être plus efficace, et il pourrait donner des faux positifs où @SearchKey matchs Word || ' ' || Description, cela pourrait être une bonne chose, il pourrait ne pas; mais c'est peut-être un peu plus lisible, selon votre style particulier.

+0

'' ||, quoique il ressemble à '' ||, n'est pas 'OR', mais l'opérateur de concaténation SQL. –

+0

Merci beaucoup Sir Williham ... – hisoka21

1

En fonction de la taille de votre ensemble de données, vous pouvez essayer le texte intégral (si c'est une option).

Vous pouvez créer un index de texte intégral sur les trois colonnes pouvant être recherchées, ce qui vous permet également d'interroger une colonne spécifique (ou une combinaison) si le besoin s'en faisait sentir - par ex. vous voulez des lignes où le texte de recherche existe dans [Description] seulement.

if object_id('dbo.ft_example') is not null drop table dbo.ft_example; 

create table dbo.ft_example (
    rowid int identity not null constraint pk_ft_example primary key, 
    [Word] varchar(100), 
    [Description] varchar(1000), 
    [Example] varchar(500) 
    ); 

insert dbo.ft_example ([Word], [Description], [Example]) 
select 'blah blah cat', 'blah blah blah blah blah blah blah blah bird', 'blah blah blah blah fish' union all 
select 'blah blah dog', 'blah blah blah blah blah blah blah blah cat', 'blah blah blah blah horse' union all 
select 'blah blah camel', 'blah blah blah blah blah blah blah blah squid', 'blah blah blah blah horse' union all 
select 'blah blah horse', 'blah blah blah blah blah blah blah blah cat', 'blah blah blah blah moose' union all 
select 'blah blah fish', 'blah blah blah blah blah blah blah blah whale', 'blah blah blah blah bird' union all 
select 'blah blah camel', 'blah blah blah blah blah blah blah blah squirel', 'blah blah blah blah kiwi' union all 
select 'blah blah kiwi', 'blah blah blah blah blah blah blah blah bird', 'blah blah blah blah horse'; 

if exists( 
    select * 
    from sys.fulltext_indexes 
    join sys.tables 
    on sys.tables.object_id = sys.fulltext_indexes.object_id 
    where sys.tables.name = 'ft_example' 
    ) 
    drop fulltext index on ft_example; 
go 
if exists (select * from dbo.sysfulltextcatalogs where name = 'example_ft_cat') 
    drop fulltext catalog example_ft_cat; 
go 

create fulltext catalog example_ft_cat; 
create fulltext index on dbo.ft_example ([Word], [Description], [Example]) 
    key index pk_ft_example on example_ft_cat; 
go 

select * 
from dbo.ft_example a 
join containstable(ft_example, ([Word], [Description], [Example]), 'bird') b 
     on a.rowid = b.[key] 
Questions connexes