【问题标题】:Using LIKE for multiple columns SQL Server对多列 SQL Server 使用 LIKE
【发布时间】:2018-12-17 15:11:42
【问题描述】:

我正在使用 SQL Server 搜索包含某个值的一部分的表中的多个列(实际上超过 20 个),但我不断收到错误

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

我正在运行 SQL Server 2017,并且该功能应该可用,因此我不确定我的查询中是否有错误或其他原因导致错误。

SELECT *
FROM table 
WHERE 
   CONCAT(col1, col2, col3, col4, col5, col6, col7, col8) LIKE '%val%'

提前谢谢你

【问题讨论】:

  • 样本数据会很好。
  • 您确定要让您的选择在例如以下情况下返回数据吗? col1 = 'v', col2='a' 和 col3 = 'l' ?
  • 请注意,'somewhere' || 'wolfenstein' like '%wherewolf%' 返回 true
  • 正是我之前的观点。不过我喜欢这个笑话:)

标签: sql sql-server


【解决方案1】:

使用+:

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%'

【讨论】:

    【解决方案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 方法并不可怕,可能是发现阶段的另一种选择。

    【讨论】:

    • 我喜欢你的回答@John (+1)
    • @PawelCzapski 谢谢你的笑容:)。请参阅编辑以进行快速比较和评论。
    【解决方案3】:

    我会稍微调整 Gordon 的解决方案,在连接的术语之间插入一些分隔符,以避免一个值的结尾和下一个值的开头结合起来为您提供匹配的情况。

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

    【讨论】:

    • 看来这真的应该是对戈登对我的回答的评论。另外,我从不使用单字符分隔符(可能是数据的一部分);我选择更像“[DELIM]”的东西。
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2019-02-12
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多