首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串SQL中的数字和

字符串SQL中的数字和
EN

Stack Overflow用户
提问于 2022-05-13 12:45:34
回答 3查看 123关注 0票数 -5

假设我有带有数字和非数字字符串的列。例如,1a2b~#3c。如何找到这些字符串中数字的和。我不能使用CTE,我的查询应该以SELECT开头

EN

回答 3

Stack Overflow用户

发布于 2022-05-13 14:10:31

使用内联数字表(如果可能的话使用永久表,尽管尽可能多的行作为最大的字符串),我将按照以下方式解决这个问题:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2022-05-13 14:29:30

这是我的版本。看上去很像斯图发布的那个。

代码语言:javascript
复制
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,则可以将其稍微修改为如下所示。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-05-13 16:16:51

下面是使用STRING_SPLIT的非无聊版本。当然,对于“不无聊”,你也可以阅读“过度设计”,这取决于你的喜好。

代码语言:javascript
复制
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个重复子句的总和也是很简单的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72229840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档