我正在使用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获取我想要的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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
的功能,然后再应用上述逻辑。