我有一个如下所示的文本表,是否有任何一个简单的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
答案 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)
答:没有。这是可能的,但不是简单的说法......我相信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