开发者社区 问答 正文

获取名称SQL Server中具有多个字符串的行

我正在使用Sql Server 2014,我尝试获取名称中具有多个值的行,例如:

declare @value ='m n'

所以return的值在我尝试使用的任何位置都应该有'm'和'n'

Select * from Table where contains(name,N'"*m*" and "*n*"')

但是该值仅在以m和n开头时才返回

我也尝试过:

select * from Table where name like '%m%n%'

仅当名称包含m然后n而不是n然后m时才返回值

注意:我从参数获取值,所以我不知道有多少字符或位置,所以我在@value上使用replace获取我想要的

展开
收起
心有灵_夕 2019-12-10 17:27:47 576 分享 版权
阿里云 AI 助理回答

在SQL Server中,要查询名称列中同时包含多个特定子串(无论顺序如何)的行,可以使用一个较为复杂的策略,特别是当这些子串的位置不固定时。你的尝试已经很接近了,但这里有一个更通用的方法来解决这个问题,尤其是当你不确定子串的数量或位置时。

假设你有一个变量 @value 包含了你想要搜索的所有子串,比如 'm n',你可以编写一个动态SQL来构建一个LIKE语句,确保每个子串都能在名称列中找到,不论顺序。以下是一个可能的解决方案:

DECLARE @value NVARCHAR(100) = 'm n'; -- 假设值是这样的
DECLARE @searchTerms NVARCHAR(MAX) = '';
DECLARE @sql NVARCHAR(MAX);

-- 构建LIKE模式,确保每个词都用%包围以匹配任何位置
SELECT @searchTerms = COALESCE(@searchTerms + '%', '') + '%' + value + '%' 
FROM STRING_SPLIT(@value, ' '); -- 使用STRING_SPLIT将值分割成单独的词

-- 构建最终的SQL查询
SET @sql = N'SELECT * FROM Table WHERE name LIKE ''' + @searchTerms + ''''; 

-- 执行动态SQL
EXEC sp_executesql @sql;

这段代码首先使用STRING_SPLIT函数将@value中的每个子串分开,并为每个子串添加前后的%作为通配符,然后将它们连接起来形成一个大的LIKE模式,这样就可以在一个查询中查找所有指定的子串,不论它们在字符串中的相对位置如何。

请注意,这个方法依赖于SQL Server 2016及以后版本提供的STRING_SPLIT函数。由于你提到使用的是SQL Server 2014,你可能需要自定义一个字符串分割函数或者升级到支持该功能的SQL Server版本。对于SQL Server 2014,你可以创建一个用户定义的表值函数来实现类似STRING_SPLIT的功能,然后再应用上述逻辑。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答