首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从sql server中的某些字符串中提取数字

从sql server中的某些字符串中提取数字
EN

Stack Overflow用户
提问于 2021-04-07 09:38:09
回答 2查看 61关注 0票数 0

我的短信如下所示

代码语言:javascript
复制
AB-MFG 49UN STEEL
GH-NH, 345UN IRON
M787 UH, 77 UNITS GREY
G7-YUT 365 UNITS WHITE 

我想在字符串UNUNITS之前提取数字

代码语言:javascript
复制
+------------------------+-----+
| AB-MFG 49UN STEEL      | 49  |
+------------------------+-----+
| GH-NH, 345UN IRON      | 345 |
+------------------------+-----+
| M787 UH, 77 UNITS GREY | 77  |
+------------------------+-----+
| G7-YUT 365 UNITS WHITE | 365 |
+------------------------+-----+

目前,我使用的是属于查询。我必须写一份案例陈述来涵盖这两种情况。有其他有效的解决方案吗?

代码语言:javascript
复制
SELECT REVERSE(SUBSTRING(SUBSTRING(REVERSE(LEFT(desc, CHARINDEX('UN ', desc))), 2, 1000), 1, CHARINDEX(' ', SUBSTRING(REVERSE(LEFT(desc, CHARINDEX('UN ', desc))), 2, 1000))))
FROM MYTABLE
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-08 13:08:50

您可以将PATINDEXCROSS APPLY结合使用。我看到一个模式,您所需的数字总是出现在空格和关键字前面。如果是这样的话,可以使用下面的代码。

代码语言:javascript
复制
SELECT DESC, 
       CASE WHEN UN.I !=0 THEN SUBSTRING(DESC,NUM.I+1,UN.I-NUM.I-1)
            WHEN UNITS.I !=0 THEN SUBSTRING(DESC,NUM.I+1,UNITS.I-NUM.I-1)
            ELSE ''
       END AS REQUIRED_NUM
FROM MYTABLE
CROSS APPLY (VALUES(PATINDEX('%UN %', DESC)))UN(I)
CROSS APPLY (VALUES(PATINDEX('% UNITS%',DESC)))UNITS(I)
CROSS APPLY (VALUES(PATINDEX('% [0-9]%', DESC)))NUM(I)

请注意,desc是server中的关键字。您应该避免将其用于列名。

票数 1
EN

Stack Overflow用户

发布于 2021-04-07 11:27:50

你可以用IIF代替这个案子

代码语言:javascript
复制
declare @mytable table (value varchar(100))

insert into @mytable values('AB-MFG 49UN STEEL'), 
                           ('GH-NH, 345UN IRON'),
                           ('M787 UH, 77 UNITS GREY'),
                           ('G7-YUT 365 UNITS WHITE')

select IIF(CharIndex('un ', value) = 0, CharIndex('units', value), CharIndex('un ', value))
from   @mytable

这将返回UNUNITS的位置。

从那里你可以再做剩下的事。

这并不是更好,但至少是一种替代方案。

编辑

完整的查询将如下所示

代码语言:javascript
复制
declare @mytable table (value varchar(100))

insert into @mytable values('AB-MFG 49UN STEEL'), 
                           ('GH-NH, 345UN IRON'),
                           ('M787 UH, 77 UNITS GREY'),
                           ('G7-YUT 365 UNITS WHITE')

select reverse(left(ltrim(SUBSTRING(REVERSE(LEFT(value, t.PosValue)), 2, 1000)), charindex(' ', ltrim(SUBSTRING(REVERSE(LEFT(value, t.PosValue)), 2, 1000)))))
from   ( select value,
                IIF(CharIndex('un ', value) = 0, CharIndex('units', value), CharIndex('un ', value)) as PosValue
         from   @mytable
       ) t 

结果就是

代码语言:javascript
复制
COLUMN1
49 
345 
77 
365 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66983383

复制
相关文章

相似问题

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