Tsql T-SQL:在多个分隔符上拆分字符串

Tsql T-SQL:在多个分隔符上拆分字符串,tsql,split,Tsql,Split,我被赋予了一个T-SQL任务:将所有大写字母中的名称转换/格式化为标题大小写。我已经决定将名称拆分为标记,并将每个标记的第一个字母大写,这将是一种合理的方法(如果有更好的选择,我愿意接受建议,特别是在T-SQL中) 也就是说,要完成这一点,我必须拆分空格、破折号、连字符等上的名称字段。然后,一旦标记化,我就可以担心大小写的规范化 是否有任何合理的方法将字符串沿列表中的任何分隔符拆分?如果易用性和性能很重要,请获取一份 下面是一个基本示例,其中我拆分了非字母或数字的任何字符([^a-z0-9]):

我被赋予了一个T-SQL任务:将所有大写字母中的名称转换/格式化为标题大小写。我已经决定将名称拆分为标记,并将每个标记的第一个字母大写,这将是一种合理的方法(如果有更好的选择,我愿意接受建议,特别是在T-SQL中)

也就是说,要完成这一点,我必须拆分空格、破折号、连字符等上的名称字段。然后,一旦标记化,我就可以担心大小写的规范化


是否有任何合理的方法将字符串沿列表中的任何分隔符拆分?

如果易用性和性能很重要,请获取一份

下面是一个基本示例,其中我拆分了非字母或数字的任何字符(
[^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
它会返回您需要的内容以及:

  • 项目的长度(ItemLength)
  • 它在字符串中的位置(ItemIndex)
  • 它是字符串中的顺序位置(ItemNumber.)
  • 现在靠着桌子。在这里,我们做同样的事情,但我将显式地调用我想要用作分隔符的字符。这里是这些字符中的任意一个:
    *。&,?%/>

    -- 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           ?