SQL-запрос для поиска записи, которая имеет определенный текст? - PullRequest
2 голосов
/ 22 февраля 2010

Как я могу запросить запись, которая содержит определенный ввод текста от пользователя?

Например, в моей функции адаптера таблицы:

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

Очевидно, что из БД будет получена только запись с точным текстом из определенного ввода. Что мне нужно сделать, это получить все записи, содержащие входные тексты от пользователя.

Ответы [ 3 ]

7 голосов
/ 22 февраля 2010
SELECT Word, Description, Example
FROM WordLists
WHERE ( (Word LIKE '%' + @SearchKey + '%') 
   OR (Description LIKE '%' + @SearchKey + '%') 
   OR (Example LIKE '%' + @SearchKey +'%') ) 
1 голос
/ 22 февраля 2010

В зависимости от размера вашего набора данных, вы можете попробовать полный текст (если это вариант).

Вы можете создать полнотекстовый индекс по всем 3 столбцам с возможностью поиска, который также даст вам возможность запросить конкретный (или комбинацию), если возникнет такая необходимость, например Вы хотите строки, в которых текст поиска существует только в [Description].

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]
1 голос
/ 22 февраля 2010

Другой вариант:

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

Это может (или не может) быть более эффективным, и это может привести к некоторым ложным срабатываниям, когда @SearchKey соответствует Word || ' ' || Description, это может быть хорошо, а может и нет; но это может быть немного более читабельно, в зависимости от вашего стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...