我一直在讨论如何在 SQL DW 中实现这一点。我需要在返回值中提取两个句点之间的文本。所以我为 Result 返回的值是:
我正在尝试提取周期 1 和 2 之间的值,所以上面的红色部分:
这些值将是各种长度。
我有这个代码:
substring(Result,charindex('.',Result)+1,3) as ResultMid
结果是:
我的问题是我不确定如何返回可变长度,以便我可以在两个时期之间提取全部值。有人会碰巧知道我怎么能做到这一点吗?
谢谢,乔
我一直在讨论如何在 SQL DW 中实现这一点。我需要在返回值中提取两个句点之间的文本。所以我为 Result 返回的值是:
我正在尝试提取周期 1 和 2 之间的值,所以上面的红色部分:
这些值将是各种长度。
我有这个代码:
substring(Result,charindex('.',Result)+1,3) as ResultMid
结果是:
我的问题是我不确定如何返回可变长度,以便我可以在两个时期之间提取全部值。有人会碰巧知道我怎么能做到这一点吗?
谢谢,乔
我们可以基于您当前的尝试:
substring(
result,
charindex('.', result) + 1,
charindex('.', result, charindex('.', result) + 1) - charindex('.', result) - 1
)
理由:你已经有前两个论点是substring()正确的。第三个参数定义要捕获的字符数。为此,我们使用表达式计算下一个点 ( ) 的位置: 。然后我们从该值中减去第一个点的位置,这给出了我们应该捕获的字符数。.charindex('.', result, charindex('.', result) + 1)
结果 | result_mid :------------------------ | :--------- sam.pdc.sys.paas.l.com | pdc sm.ridl.sys.paas.m.com | 谜语 s.sandbox.sys.paas.g.com | 沙盒
如果您要处理字符串的每个分隔部分最多 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;