我有一个表格团队
Id Name ...
1 Chelsea
2 Arsenal
3 Liverpool
现在我需要搜索我的队桌是否有像#34; Chelsea FC"这样的名字。在这种情况下,当搜索字符串可能有额外的单词时,如何进行选择查询?
我可以尝试使用Lucene.net,但只是因为一小部分内容而感觉有点过头而且学习它需要时间。
答案 0 :(得分:9)
您需要将字符串拆分并按字符串中的每个单词进行搜索。 SQL Server没有这样做的本机功能,但网上有各种各样的例子。
此函数将采用字符串和分隔符,它将通过分隔符拆分字符串并返回结果值的表。
CREATE FUNCTION dbo.SplitVarchar (@stringToSplit varchar(4000), @delimiter CHAR(1))
RETURNS @Result TABLE(Value VARCHAR(50))AS
BEGIN
--This CTE will return a table of (INT, INT) that signify the startIndex and stopIndex
--of each string between delimiters.
WITH SplitCTE(startIndex, stopIndex) AS
(
SELECT 1, CHARINDEX(@delimiter, @stringToSplit) --The bounds of the first word
UNION ALL
SELECT stopIndex + 1, CHARINDEX(@delimiter, @stringToSplit, stopIndex+1)
FROM SplitCTE --Recursively call SplitCTE, getting each successive value
WHERE stopIndex > 0
)
INSERT INTO @Result
SELECT
SUBSTRING(@stringToSplit, --String with the delimited data
startIndex, --startIndex of a particular word in the string
CASE WHEN stopIndex > 0 THEN stopIndex-startIndex --Length of the word
ELSE 4000 END --Just in case the delimiter was missing from the string
) AS stringValue
FROM SplitCTE
RETURN
END;
将分隔后的字符串转换为表格后,可以将其与要搜索的表格一起加入,并按照这种方式比较值。
DECLARE @TeamName VARCHAR(50)= 'Chelsea FC'
SELECT DISTINCT Name
FROM Team
INNER JOIN (SELECT Value FROM dbo.SplitVarchar(@TeamName, ' ')) t
ON CHARINDEX(t.Value, Name) > 0
结果:
| Name |
|---------|
| Chelsea |
我的设计基于Amit Jethva的Convert Comma Separated String to Table : 4 different approaches
答案 1 :(得分:2)
您可以这样使用like
:
declare @s varchar(20) = 'Chelsey FC'
select * from Team
where name like '%' + @s + '%' or
@s like '%' + name + '%'
如果@s
包含Name
或Name
包含@s
,则会过滤行。
答案 2 :(得分:0)