Tsql T-SQL:在多个分隔符上拆分字符串
我被赋予了一个T-SQL任务:将所有大写字母中的名称转换/格式化为标题大小写。我已经决定将名称拆分为标记,并将每个标记的第一个字母大写,这将是一种合理的方法(如果有更好的选择,我愿意接受建议,特别是在T-SQL中) 也就是说,要完成这一点,我必须拆分空格、破折号、连字符等上的名称字段。然后,一旦标记化,我就可以担心大小写的规范化Tsql T-SQL:在多个分隔符上拆分字符串,tsql,split,Tsql,Split,我被赋予了一个T-SQL任务:将所有大写字母中的名称转换/格式化为标题大小写。我已经决定将名称拆分为标记,并将每个标记的第一个字母大写,这将是一种合理的方法(如果有更好的选择,我愿意接受建议,特别是在T-SQL中) 也就是说,要完成这一点,我必须拆分空格、破折号、连字符等上的名称字段。然后,一旦标记化,我就可以担心大小写的规范化 是否有任何合理的方法将字符串沿列表中的任何分隔符拆分?如果易用性和性能很重要,请获取一份 下面是一个基本示例,其中我拆分了非字母或数字的任何字符([^a-z0-9]):
是否有任何合理的方法将字符串沿列表中的任何分隔符拆分?如果易用性和性能很重要,请获取一份 下面是一个基本示例,其中我拆分了非字母或数字的任何字符(
[^a-z0-9]
):
输出:
itemNumber itemIndex itemLength item
--------------- ----------- ----------- -------------
1 1 3 abc
2 5 3 123
3 9 3 xyz
4 13 7 4445556
5 22 4 5566
6 27 3 rrr
它会返回您需要的内容以及:
*。&,?%/>
-- Sample Table
DECLARE @table TABLE (SomeId INT IDENTITY, SomeString VARCHAR(100));
INSERT @table VALUES('abc***332211,,XXX'),('abc.123&&555%jjj'),('ll/111>ff?12345');
SELECT t.*, pe.*
FROM @table AS t
CROSS APPLY samd.patExtract8K(t.SomeString,'[*.&,?%/>]') AS pe;
这将返回:
SomeId SomeString itemNumber itemIndex itemLength item
----------- ------------------- ------------ ---------- ----------- ---------
1 abc***332211,,XXX 1 1 3 abc
1 abc***332211,,XXX 2 7 6 332211
1 abc***332211,,XXX 3 15 3 XXX
2 abc.123&&555%jjj 1 1 3 abc
2 abc.123&&555%jjj 2 5 3 123
2 abc.123&&555%jjj 3 10 3 555
2 abc.123&&555%jjj 4 14 3 jjj
3 ll/111>ff?12345 1 1 2 ll
3 ll/111>ff?12345 2 4 3 111
3 ll/111>ff?12345 3 8 2 ff
3 ll/111>ff?12345 4 11 5 12345
另一方面,如果我想提取分隔符,我可以这样更改模式:[^*&,?%/>]
。现在,相同的查询返回:
SomeId itemNumber itemIndex itemLength item
----------- -------------------- -------------------- ----------- ---------
1 1 4 3 ***
1 2 13 2 ,,
2 1 4 1 .
2 2 8 2 &&
2 3 13 1 %
3 1 3 1 /
3 2 7 1 >
3 3 10 1 ?
看看下面的帖子:名字?你根本不知道你正在打开的蠕虫罐头。这是听起来很简单的事情之一,直到你真正开始挖掘你绝对必须解释的数以千计的边缘案例。建议阅读:。@JoelCoehoorn:我没有打开一罐蠕虫。测试人员做到了。
SomeId itemNumber itemIndex itemLength item
----------- -------------------- -------------------- ----------- ---------
1 1 4 3 ***
1 2 13 2 ,,
2 1 4 1 .
2 2 8 2 &&
2 3 13 1 %
3 1 3 1 /
3 2 7 1 >
3 3 10 1 ?