检索值中两个句点之间的文本

Retrieve text between two periods in a value

我一直在思考如何在 SQL DW 中实现这一点。我需要提取 returned 值中两个句点之间的文本。所以我的结果值 returned 是:

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

值的长度范围很广。

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

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

谢谢, 乔

我们可以在您当前的尝试的基础上继续努力:

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

理由:您已经正确地掌握了 substring() 的前两个参数。第三个参数定义要捕获的字符数。为此,我们计算 下一个 点 (.) 的位置,表达式为:charindex('.', result, charindex('.', result) + 1)。然后我们从该值中减去第一个点的位置,得到我们应该捕获的字符数。

Demo on DB Fiddle:

result                   | result_mid
:----------------------- | :---------
sam.pdc.sys.paas.l.com   | pdc       
sm.ridl.sys.paas.m.com   | ridl      
s.sandbox.sys.paas.g.com | sandbox   

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

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

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

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