从 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
我想提取字符串 UN
和 UNITS
之前的数字
+------------------------+-----+
| 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
您可以将 PATINDEX
与 CROSS 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 服务器中的关键字。您应该避免将其用于列名。
我有如下文字
AB-MFG 49UN STEEL
GH-NH, 345UN IRON
M787 UH, 77 UNITS GREY
G7-YUT 365 UNITS WHITE
我想提取字符串 UN
和 UNITS
+------------------------+-----+
| 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
您可以将 PATINDEX
与 CROSS 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 服务器中的关键字。您应该避免将其用于列名。