对多个列使用LIKE SQL Server

时间:2018-12-17 15:11:43

标签: 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%'

提前谢谢

3 个答案:

答案 0 :(得分:3)

使用+

where (col1 + col2 + col3 + col4 + col5 + col6 + col7 + col8) like '%val%'

这假定所有列都是非NULL字符串列。

如果它们可能是NULL或不是字符串,则需要显式转换:

where (coalesce(convert(nvarchar(max), col1), '') +
       coalesce(convert(nvarchar(max), col2), '') +
       . . .
       coalesce(convert(varchar(max), col8), '') +
      ) like '%val%'

答案 1 :(得分:2)

还有另一种选择,但是我怀疑concat()或Gordon(+1)的表现会更好

Select *
 From  YourTable A
 Where (select A.* for xml raw) like '%YourSearch%'
  

编辑

只是为了好玩,我比较了concat()和xml方法。样本为25K行,其中101列。 concat的5次运行平均为886毫秒,而xml为1.162。

显然concat()是赢家,但是xml方法并不可怕,并且可能是发现阶段的另一种选择。

答案 2 :(得分:0)

我会稍稍调整Gordon的解决方案,在连接的术语之间插入一些定界字符,以避免出现其中一个值的末尾与下一个值的开始相结合以提供匹配的情况。

where (col1 + '|' + col2 + '|' + col3 + '|' + col4 + '|' + col5 + '|' + col6 + '|' + col7 + '|' + col8) like '%val%'