从 sql 服务器中的某些字符串中提取数字

Extract number from certain strings in sql server

我有如下文字

AB-MFG 49UN STEEL
GH-NH, 345UN IRON
M787 UH, 77 UNITS GREY
G7-YUT 365 UNITS WHITE 

我想提取字符串 UNUNITS

之前的数字
+------------------------+-----+
| AB-MFG 49UN STEEL      | 49  |
+------------------------+-----+
| GH-NH, 345UN IRON      | 345 |
+------------------------+-----+
| M787 UH, 77 UNITS GREY | 77  |
+------------------------+-----+
| G7-YUT 365 UNITS WHITE | 365 |
+------------------------+-----+

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

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

您可以使用 IIF 代替大小写

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
                 

这将 return UN UNITS
的位置 从那里你可以再次完成所有剩下的事情。

它并没有好多少,但它至少可以替代这种情况

编辑

完整的查询看起来比

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 

结果是这样

COLUMN1
49 
345 
77 
365 

您可以将 PATINDEXCROSS APPLY 一起使用。 我看到一个模式,您需要的号码总是出现在 space 之后和您的关键字 之前。如果是这样,您可以使用以下代码。

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 是 sql 服务器中的关键字。您应该避免将其用于列名。