2009-10-02 162 views
1

好吧,所以我正在进行基本搜索SPROC。 参数之一是一个搜索文本(这将是测试用户输入,单词由空格等分开)'简单'SQL搜索查询

现在我需要的是在表中的单个列上搜索这些单词,但我希望它具有所有输入的关键字(目前我所能做的就是如果其中一个存在)

那么是否有一个特殊的SQL命令允许我这样做?

+0

问题与2个答案是搜索词总是会有所不同。我可以将这些词汇转换成表格,但是我仍然不太确定如何搜索它们,因为我可以在该表格上做一个IN,但这仍然是同样的问题... – dkarzon

回答

2

你可以尝试这样的事情

检查所需要的话occurances,并比较分裂的话计数。

所有的问题,我预见是匹配部分单词,但是这可能让你开始

/* 
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

这似乎工作得很好!谢谢! – dkarzon

0

您需要将@SEARCH_TEXT拆分为单词并理想地将其存储在临时表@FILTER_TABLE中,其中包含单词的一列WORD。你可以谷歌的“SQL逗号分割...”,但回答this question可能会有所帮助。 This也很有趣。

然后,您只需在您的查询中使用JOIN来过滤行。最简单的查询,那么这将返回所有的比赛将是:

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

但是,如果你提供你的数据和预期结果的例子,人们可能会更有帮助。