SQL - 如何在单元格中的两个下划线之间提取4位数字

时间:2015-03-17 17:02:38

标签: sql sql-server

我有以下字段,我需要在两个下划线之间提取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个下划线之后等。

我如何解决这个问题?

谢谢!

2 个答案:

答案 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