假设我有带有数字和非数字字符串的列。例如,1a2b~#3c。如何找到这些字符串中数字的和。我不能使用CTE,我的查询应该以SELECT开头
发布于 2022-05-13 14:10:31
使用内联数字表(如果可能的话使用永久表,尽管尽可能多的行作为最大的字符串),我将按照以下方式解决这个问题:
declare @string varchar(50)='1a24b~0#3c1'
select Sum(n)
from (select @string s)s
cross apply(
select Try_Convert(int,Substring(s,p,1))
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15))x(p)
where p <= Len(s) and Ascii(Substring(s,p,1)) between 49 and 57
)x(n)发布于 2022-05-13 14:29:30
这是我的版本。看上去很像斯图发布的那个。
select sum(try_convert(int, MyNum))
from
(
select MyNum = substring(x.y, t.n, 1)
from (values('1a2b~#3c'))x(y)
join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))t(n) on t.n <= len(x.y)
) t如果您在try_convert之前使用的是较早版本的sql server,则可以将其稍微修改为如下所示。
select sum(convert(int, MyNum))
from
(
select MyNum = substring(x.y, t.n, 1)
from (values('1a2b~#3c'))x(y)
join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))t(n) on t.n <= len(x.y)
where substring(x.y, t.n, 1) like '[0-9]'
) t发布于 2022-05-13 16:16:51
下面是使用STRING_SPLIT的非无聊版本。当然,对于“不无聊”,你也可以阅读“过度设计”,这取决于你的喜好。
declare @s varchar(50) = '1a2b~#3c';
select sum(c)
from (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')) v(n)
cross apply (
select c = count(*) * n - n
from string_split(@string, n)
) _与其他解决方案不同的是,这里的VALUES子句不是一个理货表,它适用于任意长度的字符串(尽管对于具有许多位数的长字符串,它变得非常低效,但几乎可以肯定,对于任何必须坚持纯to的解决方案,这几乎都是正确的)。如果CROSS APPLY和/或VALUES被认为太高级了,那么将其重写为10个重复子句的总和也是很简单的。
https://stackoverflow.com/questions/72229840
复制相似问题