«Простой» SQL-запрос поиска - PullRequest
1 голос
/ 02 октября 2009

Хорошо, так что я работаю над базовым поиском SPROC. Одним из параметров является текст поиска (это будет тест, в который вводится пользователь, слова, разделенные пробелами и т. Д.)

Теперь все, что мне нужно, - это поиск этих слов по одному столбцу в таблице, НО я хочу, чтобы в нем были ВСЕ ключевые слова, которые были введены (на данный момент все, что я могу сделать, - это найти 1 из них)

Так есть ли специальные команды SQL, которые позволяют мне это делать?

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

Вы можете попробовать что-то вроде этого

проверить вхождение требуемых слов и сравнить с количеством разбитых слов.

Все, что я вижу, это совпадения с частичными словами, но это может помочь вам начать

/*
ALTER FUNCTION [dbo].[SplitString]
(
        @String VARCHAR(8000) ,
        @Delimiter  VARCHAR(10)
)
RETURNS @RetTable TABLE(
        String varchar(1000)
)
AS 
BEGIN
    DECLARE @i INT ,
            @j INT
    SELECT  @i = 1
    WHILE @i <= LEN(@String)
    BEGIN
        SELECT  @j = CHARINDEX(@Delimiter, @String, @i)
        IF @j = 0
        BEGIN
            SELECT  @j = LEN(@String) + 1
        END
        INSERT  @RetTable SELECT SUBSTRING(@String, @i, @j - @i)
        SELECT  @i = @j + LEN(@Delimiter)
    END
    RETURN
END
*/

DECLARE @SearchString VARCHAR(MAX)

SELECT @SearchString = 'your,of'

DECLARE @SearchStringTable TABLE(
        Words VARCHAR(MAX)
)

DECLARE @TABLE TABLE(
        Col VARCHAR(MAX)
)

INSERT INTO @TABLE (Col)
SELECT 
'On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document.'
INSERT INTO @TABLE (Col)
SELECT 
'You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks.'
INSERT INTO @TABLE (Col)
SELECT 
'When you create pictures, charts, or diagrams, they also coordinate with your current document look.'

INSERT INTO @SearchStringTable (Words) SELECT * FROM dbo.SplitString(@SearchString,',')

SELECT  t.Col,
        COUNT(1) AS Number
FROM    @TABLE t,
        @SearchStringTable s
WHERE   CHARINDEX(s.Words,t.Col) > 0
GROUP BY t.Col
HAVING  COUNT(1) = (SELECT COUNT(1) FROM @SearchStringTable)
0 голосов
/ 02 октября 2009

Вам нужно разделить @SEARCH_TEXT на слова и в идеале сохранить его во временной таблице @FILTER_TABLE с одним столбцом WORD, содержащим слова. Вы можете использовать Google для поиска "sql comma split ...", но ответ на этот вопрос может оказаться полезным. Это тоже интересно.

Тогда вы просто используете JOIN в своем запросе для фильтрации строк. Простейший запрос, который вернул бы все совпадения, был бы:

SELECT  t.*
        f.WORD
FROM    MyTable t
JOIN    @FILTER_TABLE f
    ON t.MyColumn = f.WORD --// = or LIKE operator

Но если вы предоставите пример ваших данных и ожидаемого результата, люди могут быть более полезными.

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