Tsql 大量文本需要修剪的情况
我的查询中有一个输出,可以提供: XXXXXXXXXXXXXXXX:123456(xx)-XXXXXXXXXX 或 XXXXXXXXXXXXXXXX:12345678(xx)-XXXXXXXXXX 基本上是在6位或8位数字之前输入文本,然后在后面输入文本 理想情况下,我希望能够对这个列进行装箱,这样我就有了一个输出,其中6位数字=伦敦,8位数字=巴黎 但我一直在思考如何让案例陈述达到这一目的——基本上删掉大量文本,计算出数字是6位还是8位,然后告诉我是伦敦还是巴黎。我不确定这是否可能Tsql 大量文本需要修剪的情况,tsql,Tsql,我的查询中有一个输出,可以提供: 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)
的索引添加另一列,它与当前答案中的其他两种情况没有区别。谢谢。我设法用这种方式整理了我的简单案例陈述和你更复杂的回答。非常感谢你的帮助。