【问题标题】:T-SQL: split string on multiple delimitersT-SQL:在多个分隔符上拆分字符串
【发布时间】:2021-06-23 17:30:55
【问题描述】:

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

也就是说,要做到这一点,我必须将名称字段拆分为空格和破折号、连字符等。然后,一旦它被标记化,我就可以担心规范化大小写了。

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

【问题讨论】:

标签: tsql split


【解决方案1】:

如果易用性和性能很重要,请获取PatExtract8k 的副本。

这是一个基本示例,我在任何不是字母或数字的字符上进行拆分 ([^a-z0-9]):

-- Sample String
DECLARE @string VARCHAR(8000) = 'abc.123&xyz!4445556__5566^rrr';

-- Basic Use
SELECT pe.* FROM   samd.patExtract8K(@string,'[^a-z0-9]') AS pe;

输出:

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

它会返回您所需要的以及:

  1. 项目的长度(ItemLength)
  2. 它在字符串中的位置(ItemIndex)
  3. 它在字符串中的序号位置 (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           ?

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 2019-08-21
    • 2014-03-13
    • 1970-01-01
    • 2020-04-17
    • 2011-07-03
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多