0

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

![在此处输入图像描述

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

在此处输入图像描述

这些值将是各种长度。

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

在此处输入图像描述

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

谢谢,乔

4

2 回答 2

1

我们可以基于您当前的尝试:

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

理由:你已经有前两个论点是substring()正确的。第三个参数定义要捕获的字符数。为此,我们使用表达式计算下一个点 ( ) 的位置: 。然后我们从该值中减去第一个点的位置,这给出了我们应该捕获的字符数。.charindex('.', result, charindex('.', result) + 1)

DB Fiddle 上的演示

结果 | result_mid
:------------------------ | :---------
sam.pdc.sys.paas.l.com | pdc       
sm.ridl.sys.paas.m.com | 谜语      
s.sandbox.sys.paas.g.com | 沙盒   
于 2020-01-17T22:06:16.297 回答
0

如果您要处理字符串的每个分隔部分最多 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;

演示

于 2020-01-18T01:02:53.753 回答