每第三个字符后添加逗号
我有一个包含CCode的 varchar 列的表- 它是一个 60 个字符的字符串,其中每 3 位数字是一个 CCode。
例子:
149001006000000000000000000000000000000000000000000000000000
这转化为以下 CCode:149, 001, 006, 000, ..
我想查询它以找到某些 CCode(例如 347)。
我不能使用“like”关键字,因为它们可能会被移动(例如 003470111 - 这不符合条件,因为它可以转换为 003、470 和 111,而没有一个是 347)
此外,我需要它在选择语句中工作,并且最好不使用用户定义的函数(由于性能;它是一个大表)。
我目前的解决方案(实际上是我同事的)使用 stuff() 在每第三个字符后添加逗号,然后字符串拆分它们(逗号作为分隔符)。
有了这个,我们使用交叉应用来获得拆分的 CCode。
例子:
select ccode = splitcodes.value
from ...
cross apply string_split(stuff(stuff(... (CCodes, 4, 0, ','), ...), ',') as splitcodes
我想知道:有没有更好的方法?
谢谢你。
回答
如果字符串总是 60 个字符,您可以按以下方式使用 20 行的计数表:
SELECT d.CCodes
FROM (VALUES
('149001006000000000000000000000000000000000000000000000000000')
) d (CCodes)
CROSS APPLY (VALUES
(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
(10), (11), (12), (13), (14), (15), (16), (17), (18), (19)
) a (N)
WHERE SUBSTRING(d.CCodes, a.N * 3 + 1, 3) = '001'