SQL Server 2012句子拆词及CSV导入后查询异常求助
问题解决:SQL Server查询匹配问题及字符串拆分方法
一、为什么你的查询没有返回结果?
你当前的查询语句用了=来匹配'%in%',这是错误的用法:
SELECT * FROM BookTitles WHERE Title = '%in%'
在SQL Server中,=是精确匹配运算符,它只会返回Title字段完全等于'%in%'的记录——显然你的数据里没有这样的行,所以返回空结果。
要实现“包含某个子串”的模糊查询,你需要使用LIKE运算符,正确的语句应该是:
SELECT * FROM BookTitles WHERE Title LIKE '%in%'
这样就能匹配到所有Title中包含in的记录,也就是你预期的结果:
1 : Cat in the hat
5: Inside the cave
6: Incorporate
二、SQL Server 2012中拆分句子为单词的方法
SQL Server 2012没有内置的STRING_SPLIT函数(这个函数从2016版本才开始支持),所以我们需要用自定义方法来实现,这里提供两种常用方案:
方案1:递归CTE拆分法
这种方法不需要创建额外的函数,直接通过递归公共表表达式来拆分字符串:
DECLARE @InputString NVARCHAR(MAX) = 'Cat in the hat'; WITH SplitWords AS ( SELECT CAST('' AS NVARCHAR(MAX)) AS Word, CAST(@InputString AS NVARCHAR(MAX)) AS RemainingString UNION ALL SELECT CAST(LEFT(RemainingString, CHARINDEX(' ', RemainingString + ' ') - 1) AS NVARCHAR(MAX)), CAST(RIGHT(RemainingString, LEN(RemainingString) - CHARINDEX(' ', RemainingString + ' ')) AS NVARCHAR(MAX)) FROM SplitWords WHERE RemainingString > '' ) SELECT Word FROM SplitWords WHERE Word > '';
这个CTE会递归地把输入字符串按空格分割成单个单词,最终输出每个独立的单词。
方案2:创建自定义表值函数
如果你需要频繁拆分字符串,可以创建一个可复用的表值函数:
CREATE FUNCTION dbo.SplitStringToWords ( @InputString NVARCHAR(MAX), @Delimiter CHAR(1) = ' ' ) RETURNS @Result TABLE (Word NVARCHAR(MAX)) AS BEGIN DECLARE @StartIndex INT, @EndIndex INT; SET @StartIndex = 1; IF SUBSTRING(@InputString, LEN(@InputString) - 1, LEN(@InputString)) <> @Delimiter BEGIN SET @InputString = @InputString + @Delimiter; END WHILE CHARINDEX(@Delimiter, @InputString) > 0 BEGIN SET @EndIndex = CHARINDEX(@Delimiter, @InputString); INSERT INTO @Result (Word) SELECT SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex); SET @InputString = SUBSTRING(@InputString, @EndIndex + 1, LEN(@InputString)); END RETURN; END;
使用这个函数时,只需要调用:
SELECT Word FROM dbo.SplitStringToWords('Harry potter and the chamber of secrets', ' ');
就能得到拆分后的所有单词。
内容的提问来源于stack exchange,提问作者CastilloCaleb
相关产品推荐
相关产品推荐

