对多列SQL Server使用LIKE
我正在使用SQL Server搜索我的表中20多列,其中包含某个特定值的一部分,但我不断得到错误 “CONCAT”不是可识别的内置函数名 我正在运行SQL Server 2017,该函数应该可用,因此我不确定我的查询中是否有错误,或者是其他原因导致了错误对多列SQL Server使用LIKE,sql,sql-server,Sql,Sql Server,我正在使用SQL Server搜索我的表中20多列,其中包含某个特定值的一部分,但我不断得到错误 “CONCAT”不是可识别的内置函数名 我正在运行SQL Server 2017,该函数应该可用,因此我不确定我的查询中是否有错误,或者是其他原因导致了错误 SELECT * FROM table WHERE CONCAT(col1, col2, col3, col4, col5, col6, col7, col8) LIKE '%val%' 提前感谢您使用+: 这假定所有列都是非空字符
SELECT *
FROM table
WHERE
CONCAT(col1, col2, col3, col4, col5, col6, col7, col8) LIKE '%val%'
提前感谢您使用+:
这假定所有列都是非空字符串列
如果它们可以为NULL或不是字符串,则需要显式转换:
where (coalesce(convert(nvarchar(max), col1), '') +
coalesce(convert(nvarchar(max), col2), '') +
. . .
coalesce(convert(varchar(max), col8), '') +
) like '%val%'
使用+:
这假定所有列都是非空字符串列
如果它们可以为NULL或不是字符串,则需要显式转换:
where (coalesce(convert(nvarchar(max), col1), '') +
coalesce(convert(nvarchar(max), col2), '') +
. . .
coalesce(convert(varchar(max), col8), '') +
) like '%val%'
我会稍微调整Gordon的解决方案,在连接的术语之间插入一些分隔符,以避免出现一个值的结尾和下一个值的开头组合在一起的情况
where (col1 + '|' + col2 + '|' + col3 + '|' + col4 + '|' + col5 + '|' + col6 + '|' + col7 + '|' + col8) like '%val%'
我会稍微调整Gordon的解决方案,在连接的术语之间插入一些分隔符,以避免出现一个值的结尾和下一个值的开头组合在一起的情况
where (col1 + '|' + col2 + '|' + col3 + '|' + col4 + '|' + col5 + '|' + col6 + '|' + col7 + '|' + col8) like '%val%'
这只是另一种选择,但我怀疑concat或Gordon的+1会更有效
Select *
From YourTable A
Where (select A.* for xml raw) like '%YourSearch%'
编辑
为了好玩,我比较了concat和xml方法。样本为25K行,101列。concat的平均5次运行时间为886ms,而xml为1.162
显然,concat是赢家,但xml方法并不可怕,可能是发现阶段的另一种选择。只是另一种选择,但我怀疑concat或Gordon的+1会更有效
Select *
From YourTable A
Where (select A.* for xml raw) like '%YourSearch%'
编辑
为了好玩,我比较了concat和xml方法。样本为25K行,101列。concat的平均5次运行时间为886ms,而xml为1.162
显然,concat是赢家,但xml方法并不可怕,可能是发现阶段的另一种选择。示例数据会很好。您确定希望您的选择在col1='v',col2='a'和col3='l'时返回数据吗?请注意,像“%wherewolf%”这样的“某处”|“wolfenstein”返回true。这正是我前面的观点。不过,我喜欢这个笑话:尝试示例数据会很好。您确定要选择在col1='v',col2='a'和col3='l'时返回数据吗?请注意,像“%wherewolf%”这样的“某处”| |“wolfenstein”返回true。这正是我前面的观点。不过,我喜欢这个笑话:try似乎真的应该是对戈登给我的答案的评论。而且,我从不使用单字符分隔符,因为它可能是数据的一部分;我选择了更像“[DELIM]”的东西。似乎这真的应该是对Gordon给我的答案的评论。而且,我从不使用单字符分隔符,因为它可能是数据的一部分;我选择了更像“[DELIM]”的答案。我喜欢你的答案@John+1@PawelCzapski谢谢你的笑容。请参见编辑以获得快速比较和评论。我喜欢你的答案@John+1@PawelCzapski谢谢你的笑容。有关快速比较和注释,请参见编辑。