Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对多列SQL Server使用LIKE_Sql_Sql Server - Fatal编程技术网

对多列SQL Server使用LIKE

对多列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%' 提前感谢您使用+: 这假定所有列都是非空字符

我正在使用SQL Server搜索我的表中20多列,其中包含某个特定值的一部分,但我不断得到错误

“CONCAT”不是可识别的内置函数名

我正在运行SQL Server 2017,该函数应该可用,因此我不确定我的查询中是否有错误,或者是其他原因导致了错误

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谢谢你的笑容。有关快速比较和注释,请参见编辑。