【问题标题】:Retrieve text between two periods in a value检索值中两个句点之间的文本
【发布时间】:2020-05-04 19:31:48
【问题描述】:

我一直在研究如何在 SQL DW 中实现这一点。我需要在返回值中提取两个句点之间的文本。所以我为 Result 返回的值是:

我正在尝试提取周期 1 和 2 之间的值,所以上面的红色部分:

这些值的长度范围很广。

我有这个代码: substring(Result,charindex('.',Result)+1,3) as ResultMid 结果是这样的:

我的问题是我不确定如何返回可变长度,以便我可以在两个周期之间提取完整值。有人会碰巧知道我怎么能做到这一点吗?

谢谢, 乔

【问题讨论】:

  • 您提取的文本是否总是在 .sys 和第一个句点之前?
  • 很遗憾没有。我也有 .np.sys,将来可能会更多。因此,我正在尝试建立一个始终在第 1 期和第 2 期之间拉动的规则。
  • 好的,所以它总是在第一期和第二期之间,对吗?
  • 如果你的 SQL 数据库支持像 REGEXP_SUBSTR 这样的正则表达式,你可以使用这个正则表达式:'\.[^\.]+\.' .

标签: sql azure-sqldw


【解决方案1】:

我们可以在您当前的尝试的基础上再接再厉:

substring(
    result,
    charindex('.', result) + 1,
    charindex('.', result, charindex('.', result) + 1) - charindex('.', result) - 1
)

基本原理:你已经拥有substring() 的前两个参数了。第三个参数定义要捕获的字符数。为此,我们使用表达式:charindex('.', result, charindex('.', result) + 1) 计算 next 点 (.) 的位置。然后我们从该值中减去第一个点的位置,得到我们应该捕获的字符数。

Demo on DB Fiddle

结果 | result_mid :------------------------ | :--------- sam.pdc.sys.paas.l.com | pdc sm.ridl.sys.paas.m.com |谜语 s.sandbox.sys.paas.g.com |沙盒

【讨论】:

  • 宾果游戏!效果很好!谢谢
【解决方案2】:

如果您要处理字符串的每个分隔部分最多 128 个字符,请尝试parsename,如下所示。否则,GMB 有一个非常可靠的解决方案。

select *, parsename(left(result,charindex('.',result,charindex('.',result)+1)-1),1) as mid
from your_table;

另一种方法,您可以轻松修改以使用cross apply 提取字符串的第三、第四...(希望不是太遥远)部分。

select result, mid
from your_table t1
cross apply (select charindex('.',result) as i1) t2
cross apply (select charindex('.',result,(i1 + 1)) as i2) t3
cross apply (select substring(result,(i1+1),(i2-i1-1)) as mid) t4;

DEMO

【讨论】:

  • 有趣,我从未使用过交叉应用。不错的方法。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多