SQL 精确匹配列中的单词
SQL exact matching for words in a column
我正在尝试查找与我正在搜索的部分单词完全匹配的所有记录。
例如,如果我要查找其中包含单词 spire
的所有记录,我不想检索包含 aspire
或 inspire
的行。
SELECT *
FROM Table
WHERE name LIKE '%SearchedWord%'
在名称和喜欢的模式前后添加空格:
select * from Table where ' ' || name || ' ' like '% SearchWord %'
||
是 ANSI SQL 连接。有些产品有 +
或 concat()
。
您需要从name
列拆分单词,然后需要精确匹配。
需要创建以下 SplitWords
函数。它得到一个句子,其中 returns 个单词:
CREATE FUNCTION SplitWords(@text varchar(8000))
RETURNS @words TABLE (
pos smallint primary key,
value varchar(8000)
)
AS
BEGIN
DECLARE
@pos smallint,
@i smallint,
@j smallint,
@s varchar(8000)
SET @pos = 1
WHILE @pos <= LEN(@text)
BEGIN
SET @i = CHARINDEX(' ', @text, @pos)
SET @j = CHARINDEX(',', @text, @pos)
IF @i > 0 OR @j > 0
BEGIN
IF @i = 0 OR (@j > 0 AND @j < @i)
SET @i = @j
IF @i > @pos
BEGIN
-- @i now holds the earliest delimiter in the string
SET @s = SUBSTRING(@text, @pos, @i - @pos)
INSERT INTO @words
VALUES (@pos, @s)
END
SET @pos = @i + 1
WHILE @pos < LEN(@text)
AND SUBSTRING(@text, @pos, 1) IN (' ', ',')
SET @pos = @pos + 1
END
ELSE
BEGIN
INSERT INTO @words
VALUES (@pos, SUBSTRING(@text, @pos, LEN(@text) - @pos + 1))
SET @pos = LEN(@text) + 1
END
END
RETURN
END
然后执行以下 SELECT
语句以精确匹配 name
列中使用的单词:
SELECT *
FROM [Table]
WHERE 'SearchedWord' IN (SELECT value FROM dbo.SplitWords(name))
我正在尝试查找与我正在搜索的部分单词完全匹配的所有记录。
例如,如果我要查找其中包含单词 spire
的所有记录,我不想检索包含 aspire
或 inspire
的行。
SELECT *
FROM Table
WHERE name LIKE '%SearchedWord%'
在名称和喜欢的模式前后添加空格:
select * from Table where ' ' || name || ' ' like '% SearchWord %'
||
是 ANSI SQL 连接。有些产品有 +
或 concat()
。
您需要从name
列拆分单词,然后需要精确匹配。
需要创建以下 SplitWords
函数。它得到一个句子,其中 returns 个单词:
CREATE FUNCTION SplitWords(@text varchar(8000))
RETURNS @words TABLE (
pos smallint primary key,
value varchar(8000)
)
AS
BEGIN
DECLARE
@pos smallint,
@i smallint,
@j smallint,
@s varchar(8000)
SET @pos = 1
WHILE @pos <= LEN(@text)
BEGIN
SET @i = CHARINDEX(' ', @text, @pos)
SET @j = CHARINDEX(',', @text, @pos)
IF @i > 0 OR @j > 0
BEGIN
IF @i = 0 OR (@j > 0 AND @j < @i)
SET @i = @j
IF @i > @pos
BEGIN
-- @i now holds the earliest delimiter in the string
SET @s = SUBSTRING(@text, @pos, @i - @pos)
INSERT INTO @words
VALUES (@pos, @s)
END
SET @pos = @i + 1
WHILE @pos < LEN(@text)
AND SUBSTRING(@text, @pos, 1) IN (' ', ',')
SET @pos = @pos + 1
END
ELSE
BEGIN
INSERT INTO @words
VALUES (@pos, SUBSTRING(@text, @pos, LEN(@text) - @pos + 1))
SET @pos = LEN(@text) + 1
END
END
RETURN
END
然后执行以下 SELECT
语句以精确匹配 name
列中使用的单词:
SELECT *
FROM [Table]
WHERE 'SearchedWord' IN (SELECT value FROM dbo.SplitWords(name))