我有以下字段,我需要在两个下划线之间提取4位数字,如果两个下划线之间只有4位数字? 如果没有那么应该有一个空
这些是例子:
Cell
HV_August 2019_Integrated EM_DAM_3183_PROS_GEN_20110919
COO_COOL COOL Newsletter_4868_RAM_20140327
PIP_PIP TACTICAL_PIP TACTICAL LOOK_4877_PIP_NON_RIP_20140326
IPWarming_LALA_20101017-Split(2)
toomuch_12345_toomuch
和 我希望
ID
3183
4868
4877
NULL
NULL
正如您所看到的,4位数代码可能位于单元格内的任何位置,它可能位于第2个下划线或第3个下划线之后等。
我如何解决这个问题?
谢谢!
答案 0 :(得分:5)
试试这个。
DECLARE @cell_1 VARCHAR(500) = 'HV_August 2019 Integrated EM_DAM_3183_PROS_GEN_20110919 COO_COOL';
DECLARE @cell_2 VARCHAR(500) = 'COOL_Newsletter_4868_RAM_20140327 PIP_PIP TACTICAL_PIP TACTICAL';
DECLARE @cell_3 VARCHAR(500) = 'LOOK_4877_PIP_NON_RIP_20140326';
--In PATINDEX, underscore is a special character so you have to put them in brackets
--Then the [0-9] represent any number
SELECT SUBSTRING(cell,PATINDEX('%[_][0-9][0-9][0-9][0-9][_]%',cell) + 1,4) AS digit_code
FROM
(
SELECT @cell_1 AS cell
UNION ALL
SELECT @cell_2
UNION ALL
SELECT @cell_3
) A;
结果:
digit_code
----------
3183
4868
4877
答案 1 :(得分:2)
试试这个
;with CTE AS
(
SELECT 'HV_August 2019_Integrated EM_DAM_3183_PROS_GEN_20110919' Col1 UNION ALL
SELECT 'COO_COOL COOL Newsletter_4868_RAM_20140327' UNION ALL
SELECT 'PIP_PIP TACTICAL_PIP TACTICAL LOOK_4877_PIP_NON_RIP_20140326'
)
SELECT Col1,
SUBSTRING(Col1, NULLIF(PATINDEX('%[_][0-9][0-9][0-9][0-9][_]%',Col1)
+ 1,0),4) data
FROM CTE