SQL Query用于解析名称中的数字

时间:2015-03-26 12:46:03

标签: sql sql-server casting

在这种情况下,DBMS是SQL Server 2012。

我需要一个只查询设备名称中的数字的SQL查询。我的设备遵循命名方案,应该是这样的:

XXXnnnnn

XXXnnnnn-XX

其中X是一个字母,n是一个数字,应该在适当的地方用0填充。但是,并非所有名称都以这种方式正确填充。

所以,假设你有一个看起来像这样的列:

    Name
    ----
    XXX01234
    XXX222
    XXX0390-A2
    XXX00965-A1

我需要一个SQL查询,它将返回此示例列的结果,如下所示。

    Number
    ------
    01234
    00222
    00390
    00965

有人有什么想法吗?我已经尝试过像首先将名称转换为浮点数然后作为int转换的东西,但说实话,我还没有足够熟练的SQL来找到解决方案。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

SQL Server没有很棒的字符串解析功能。对于您的特定示例,我认为case语句可能是最简单的方法:

select (case when number like '___[0-9][0-9][0-9][0-9][0-9]%'
             then substring(number, 4, 5)
             when number like '___[0-9][0-9][0-9][0-9]%'
             then '0' + substring(number, 4, 4)
             when number like '___[0-9][0-9][0-9]%'
             then '00' + substring(number, 4)
             when number like '___[0-9][0-9]%'
             then '000' + substring(number, 4, 2)
             when number like '___[0-9][0-9]%'
             then '0000' + substring(number, 4, 1)
             else '00000'
        end) as EmbeddedNumber

答案 1 :(得分:0)

如果总是需要移除前3个字符,那么您可以执行类似的操作(如果字符仅在' - '符号后开始,则会起作用):

DECLARE @a AS TABLE ( a VARCHAR(100) );

INSERT  INTO @a
VALUES
        ( 'XXX01234' ),
        ( 'XXX222' ),
        ( 'XXX0390-A2' ),
        ( 'XXX00965-A1' );

SELECT RIGHT('00000' + SUBSTRING(a, 4, CHARINDEX('-',a+'-')-4),5)
FROM  @a
-- OUTPUT
01234
00222
00390
00965

另一个选项(将在前3个字符后提取数字):

SELECT
    RIGHT('00000' + LEFT(REPLACE(a, LEFT(a, 3), ''),
                         COALESCE(NULLIF(PATINDEX('%[^0-9]%',
                                                  REPLACE(a, LEFT(a, 3), '')),
                                         0) - 1,
                                  LEN(REPLACE(a, LEFT(a, 3), '')))), 5)
FROM
    @a;

    -- OUTPUT
    01234
    00222
    00390
    00965

答案 2 :(得分:0)

即使XXX可以是不同的len,这也会有效:

DECLARE @t TABLE ( n NVARCHAR(50) )

INSERT  INTO @t
VALUES  ( 'XXXXXXX01234' ),
        ( 'XX222' ),
        ( 'X0390-A2' ),
        ( 'XXXXXXX00965-A1' )

SELECT  REPLICATE('0', 5 - LEN(n)) + n AS n
FROM    ( SELECT    SUBSTRING(n, PATINDEX('%[0-9]%', n),
                              CHARINDEX('-', n + '-') - PATINDEX('%[0-9]%', n)) AS n
          FROM      @t
        ) t

输出:

n
01234
00222
00390
00965

答案 3 :(得分:0)

这可能有效:

SELECT RIGHT('00000'
             + SUBSTRING(Col, 1, ISNULL(NULLIF((PATINDEX('%-%', Col)), 0) - 1, LEN(Col))), 5)
FROM   (SELECT REPLACE(YourColumn, 'XXX', '') Col
        FROM   YourTable)t 

SQLFIDDLE