我的短信如下所示
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
发布于 2021-04-08 13:08:50
您可以将PATINDEX
与CROSS APPLY
结合使用。我看到一个模式,您所需的数字总是出现在空格和关键字前面。如果是这样的话,可以使用下面的代码。
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中的关键字。您应该避免将其用于列名。
发布于 2021-04-07 11:27:50
你可以用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
这将返回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
https://stackoverflow.com/questions/66983383
复制相似问题