【问题标题】:How to match a substring exactly in a string in SQL server?如何在 SQL Server 中精确匹配字符串中的子字符串?
【发布时间】:2023-01-09 23:07:37
【问题描述】:

我的表中有一列 workId,其值如下:

W1/2009/12345, G2/2018/2345

现在一个用户想要得到这个特定的 id G2/2018/2345。我在查询中使用 like 运算符,如下所示:

select * from u_table as s where s.workId like '%2345%'

它给了我上面提到的两个 workids。我尝试了以下查询:

select * from u_table as s where s.workId like '%2345%' and s.workId not like '_2345'

这个查询也给了我同样的结果。

如果有人请向我提供正确的查询。谢谢!

【问题讨论】:

  • 为什么不是WHERE workid = 'G2/2018/2345'?你为什么使用LIKE
  • 如果你的专栏 workid 看起来是非规范化的,你实际上应该有3个列,而不是 1。如果你修复你的设计,你可能会更容易。也许/希望你真的分别存储 3 个值,workID 是一个计算列(和 PERSISTED)?然后你可以只查询代表第三个值的列:WHERE Part3Value = 2345(可能需要用单引号引起来)。
  • 如果您使用的是 SQL Server 2012(不支持 STRING_SPLIT())并且 Id 是文本的最后一部分,WHERE s.workId + '/' LIKE '%/2345/%' 可能会有所帮助。
  • 或者至少会持续到 2345 年,@Zhorov。 ;)
  • 在提问时,您需要提供 minimal reproducible example: (1) DDL 和示例数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 您需要做什么,即逻辑和您的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面 #1 中的示例数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。

标签: sql-server sql-server-2012 substring


【解决方案1】:

为什么不使用现有的分隔符来匹配您的标准?

select * 
from u_table 
where concat('/', workId, '/') like concat('%/', '2345', '/%');

理想情况下,您的 3 个独立值当然是 3 个独立的列;在单个列中分隔多个值违反了第一范式并阻止优化器执行有效的索引查找,每次都强制扫描所有行,从而损害性能和并发性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2016-03-08
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多