我正在尝试查找与我正在搜索的单词部分完全匹配的所有记录。
例如,如果我在查找其中包含aspire
字样的所有记录,我就不希望使用inspire
或SELECT *
FROM Table
WHERE name LIKE '%SearchedWord%'
检索行。
{{1}}
答案 0 :(得分:1)
在名称和类似模式之前和之后添加空格:
select * from Table where ' ' || name || ' ' like '% SearchWord %'
||
是ANSI SQL串联。有些产品会改为+
或concat()
。
答案 1 :(得分:1)
您需要从name
列中拆分单词,然后才需要完全匹配。
需要创建以下SplitWords
功能。它得到一个句子,并在其中返回单词:
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))