【问题标题】:SQL - How to match on string pattern starting at random index inside stringSQL - 如何匹配从字符串内的随机索引开始的字符串模式
【发布时间】:2012-02-01 06:55:42
【问题描述】:

我有以下模式;

AA(AA)-NBXXYYY-CCCCCCC(CC)-DD(D)

括号中的值是可选的,可能不存在。

我只想选择字符串的 XX 部分。可以通过巧妙地使用子字符串来完成吗?如果有任何好的意见,我将不胜感激。

编辑: 一个提示可能是我总是可以跳过第一个连字符 (-) 之前的内容,它会一直存在......但仍然不确定如何实现它。

【问题讨论】:

  • 我认为你正在做一些事情,价值观是这样的; 10-1R22345-33PY101-N4 100-1R22345-33PY101Z-N4 1000-1R22345-33PY101ZZ-N4

标签: sql sql-server substring


【解决方案1】:
declare @S varchar(100) = 'AA(AA)-NBXXYYY-CCCCCCC(CC)-DD(D)'

-- First two characters after –NB
select substring(@S, charindex('-NB', @S)+3, 2)

-- Or if it is not always NB just find the first –
select substring(@S, charindex('-', @S)+3, 2)

使用您的示例数据:

;with C(col) as
(
  select '10-1R22345-33PY101-N4' union all
  select '100-1R22345-33PY101Z-N4' union all
  select '1000-1R22345-33PY101ZZ-N4'
)

select substring(col, charindex('-', col)+3, 2)
from C

【讨论】:

  • @cc0 - 第二个版本要求XX之间有两个字符。
  • @cc0 您使用了不同种类的连字符。 select ascii('-'), ascii('–')这就是为什么第二个版本有漏洞:)。使用您的示例数据尝试我的更新。
【解决方案2】:

您可以在 C# 中编写一个方法来解析文本字段。不管你做什么,你都在一个表扫描区域——没有索引会起作用。因此,如果 SQL 限制了您,请继续使用集成的 .NET 运行时。

【讨论】:

  • Tablescan 适合我的目的,我希望这次不要使用 CLR 集成。有什么聪明的主意吗?
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 2013-07-11
  • 1970-01-01
  • 2016-07-19
  • 2019-04-22
  • 2021-10-14
  • 2011-09-16
  • 2013-02-12
相关资源
最近更新 更多