Tsql 大量文本需要修剪的情况

Tsql 大量文本需要修剪的情况,tsql,Tsql,我的查询中有一个输出,可以提供: XXXXXXXXXXXXXXXX:123456(xx)-XXXXXXXXXX 或 XXXXXXXXXXXXXXXX:12345678(xx)-XXXXXXXXXX 基本上是在6位或8位数字之前输入文本,然后在后面输入文本 理想情况下,我希望能够对这个列进行装箱,这样我就有了一个输出,其中6位数字=伦敦,8位数字=巴黎 但我一直在思考如何让案例陈述达到这一目的——基本上删掉大量文本,计算出数字是6位还是8位,然后告诉我是伦敦还是巴黎。我不确定这是否可能 这种案例陈

我的查询中有一个输出,可以提供:

XXXXXXXXXXXXXXXX:123456(xx)-XXXXXXXXXX

XXXXXXXXXXXXXXXX:12345678(xx)-XXXXXXXXXX

基本上是在6位或8位数字之前输入文本,然后在后面输入文本

理想情况下,我希望能够对这个列进行装箱,这样我就有了一个输出,其中6位数字=伦敦,8位数字=巴黎

但我一直在思考如何让案例陈述达到这一目的——基本上删掉大量文本,计算出数字是6位还是8位,然后告诉我是伦敦还是巴黎。我不确定这是否可能


这种案例陈述是可以实现的吗?我们将非常感谢您的建议/指点。非常感谢。

一种方法是将公共表表达式与
patindex
一起使用

首先,创建并填充示例表(请在以后的问题中保存此步骤)

然后,使用公共表表达式获取8/6位数字的起始索引:

WITH CTE AS
(
SELECT  LongText,
        PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ([0-9][0-9])%', LongText) As Long,
        PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9] ([0-9][0-9])%', LongText) As Short
FROM @T
)
然后,使用几个case表达式选择以提取数字并获得城市:

SELECT  CASE 
            WHEN Long > 0 THEN SUBSTRING(LongText, Long, 13) 
            WHEN Short > 0 THEN SUBSTRING(LongText, Short, 11) 
        END As Number,
        CASE 
            WHEN Long > 0 THEN 'Paris'
            WHEN Short > 0 THEN 'London'
        END As City,
        LongText
FROM CTE
结果:

Number          City        LongText
123456 (43)     London      .njauaerigha n uaer gauer 345 gnaehn 123456 (43) smgmshmsrtmh s;s nt;srtn ;nbtugarg 
12345678 (65)   Paris       asdfasdfasdf 12345678 (65) asdfag gr 34 6sd 64 fasd fasdfas d fasdfasdf asdf
654321 (77)     London      zxcvzxcvzx34cv zxcvzxcv zxcv zxcv zxcv zcxvz xcv z3 45 xcvzxcz dfg dv df df zfd zdf b 654321 (77)
87654321 (99)   Paris       87654321 (99) n;arng an ; ualerg trhrt srth str sth strh ssth
NULL            NULL        snhs tgnn ang nu g;arug aegaerlhae s ;5 afnauierhga.ngae489tj 8q3y .sn.5yn b.s n .5hy 5

一种方法是使用带有
patindex
的公共表表达式

首先,创建并填充示例表(请在以后的问题中保存此步骤)

然后,使用公共表表达式获取8/6位数字的起始索引:

WITH CTE AS
(
SELECT  LongText,
        PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ([0-9][0-9])%', LongText) As Long,
        PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9] ([0-9][0-9])%', LongText) As Short
FROM @T
)
然后,使用几个case表达式选择以提取数字并获得城市:

SELECT  CASE 
            WHEN Long > 0 THEN SUBSTRING(LongText, Long, 13) 
            WHEN Short > 0 THEN SUBSTRING(LongText, Short, 11) 
        END As Number,
        CASE 
            WHEN Long > 0 THEN 'Paris'
            WHEN Short > 0 THEN 'London'
        END As City,
        LongText
FROM CTE
结果:

Number          City        LongText
123456 (43)     London      .njauaerigha n uaer gauer 345 gnaehn 123456 (43) smgmshmsrtmh s;s nt;srtn ;nbtugarg 
12345678 (65)   Paris       asdfasdfasdf 12345678 (65) asdfag gr 34 6sd 64 fasd fasdfas d fasdfasdf asdf
654321 (77)     London      zxcvzxcvzx34cv zxcvzxcv zxcv zxcv zxcv zcxvz xcv z3 45 xcvzxcz dfg dv df df zfd zdf b 654321 (77)
87654321 (99)   Paris       87654321 (99) n;arng an ; ualerg trhrt srth str sth strh ssth
NULL            NULL        snhs tgnn ang nu g;arug aegaerlhae s ;5 afnauierhga.ngae489tj 8q3y .sn.5yn b.s n .5hy 5

这非常有帮助,非常感谢。我为没有输入测试数据而道歉。我能用最后一个问题来考验你的耐心吗?非常罕见,但有时,我得到的输出是xxxxxxxxxxxxxxx:TEST12345678(xx)-xxxxxxx。。。我需要一个“Test”的输出。在上面的解决方案中,“巴黎”将适用于此类情况。我能绕开这个吗?对于更多的问题我深表歉意,但再次感谢。我尝试过:当MyColumn像“[^0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0,您可以在cte中为
TEST12345678(xx)
的索引添加另一列,它与当前答案中的其他两种情况没有区别。谢谢。我设法用这种方式整理了我的简单案例陈述和你更复杂的回答。非常感谢你的帮助。这非常有帮助,非常感谢。我为没有输入测试数据而道歉。我能用最后一个问题来考验你的耐心吗?非常罕见,但有时,我得到的输出是xxxxxxxxxxxxxxx:TEST12345678(xx)-xxxxxxx。。。我需要一个“Test”的输出。在上面的解决方案中,“巴黎”将适用于此类情况。我能绕开这个吗?对于更多的问题我深表歉意,但再次感谢。我尝试过:当MyColumn像“[^0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0,您可以在cte中为
TEST12345678(xx)
的索引添加另一列,它与当前答案中的其他两种情况没有区别。谢谢。我设法用这种方式整理了我的简单案例陈述和你更复杂的回答。非常感谢你的帮助。