从列中的SQL连续行搜索模式

时间:2010-10-14 18:16:47

标签: sql

我有一个如下所示的文本表,是否有任何一个简单的SQL查询可以从关键字模式中找到ID 3(或3到5),如“a硕士学位”。感谢?

ID    Words   
1      He  
2      has   
3      a  
4      master  
5      degree  
6      in   
7      University  
8      of  
9      South  
10     India  

4 个答案:

答案 0 :(得分:1)

一个相对简单的查询,假设被搜索的短语有三个单词并且ID将永远是连续的(所以'南方大学'将返回结果,但'南印度大学'不会):

select t1.id
from wordtable t1
join wordtable t2 on t1.id + 1 = t2.id
join wordtable t3 on t1.id + 2 = t3.id
where t1.words + ' ' + t2.words + ' ' + t3.words = @Phrase;

(SQLServer语法)

答案 1 :(得分:0)

这可能不像你想的那么干净。但是您可以创建拆分过程然后使用它。以下是http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx的一些代码。

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))        
returns @temptable TABLE (items varchar(8000))        
as        
begin        
    declare @idx int        
    declare @slice varchar(8000)        

    select @idx = 1        
        if len(@String)<1 or @String is null  return        

    while @idx!= 0        
    begin        
        set @idx = charindex(@Delimiter,@String)        
        if @idx!=0        
            set @slice = left(@String,@idx - 1)        
        else        
            set @slice = @String        

        if(len(@slice)>0)   
            insert into @temptable(Items) values(@slice)        

        set @String = right(@String,len(@String) - @idx)        
        if len(@String) = 0 break        
    end    
return        
end  

现在,您可以进行如下查询:

select * from table where words in (select items from dbo.split('a master degree',' '))

答案 2 :(得分:0)

问:有没有一个简单的SQL查询

答:没有。这是可能的,但不是简单的说法......我相信patindex可用于通过间距识别第一个单词,然后遍历每个单词。不是很简单

如果模式是“硕士学位”,那么选择第一个单词和最后一个单词并从中获取ID列会更容易,并假设两者之间的单词必须存在。如果输入可能是“拥有大学学位”,那将会更加复杂。

答案 3 :(得分:0)

我假设id是顺序的。如果没有向表中添加标识列并在查询中使用它。

这是完整的SQL。我已经尝试了它并且它可以工作

CREATE TABLE [dbo].[Words](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Word] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Words] PRIMARY KEY CLUSTERED ([ID] ASC)
)

CREATE FUNCTION [dbo].[DoesPatternMatch]
(
    @p_ID int
)
RETURNS int
AS
BEGIN
    declare @result int
    DECLARE @word2 varchar(50)
    DECLARE @word3 varchar(50)

    SELECT @word2 = word
    from Words
    where ID = @p_ID + 1

    SELECT @word3 = word
    from Words
    where ID = @p_ID + 2

    if (@word2 = 'master' and @word3 = 'degree')
        set @result = 1
    else
        set @result = 0

    return @result
END

select id
from Words
where Word = 'a' and dbo.DoesPatternMatch(ID) = 1