用于从名称解析数字的SQL查询

用于从名称解析数字的SQL查询,sql,sql-server,casting,Sql,Sql Server,Casting,本例中的DBMS是SQL Server 2012 我需要一个SQL查询,它只从设备名中获取数字。我有一些设备遵循如下命名方案: XXXnnnnn Name ---- XXX01234 XXX222 XXX0390-A2 XXX00965-A1 或 其中X是一个字母,n是一个数字,在适当的情况下,应该用0填充。但是,并非所有的名称都以这种方式正确填充 因此,假设您有一个类似以下内容的列: XXXnnnnn Name ----

本例中的DBMS是SQL Server 2012

我需要一个SQL查询,它只从设备名中获取数字。我有一些设备遵循如下命名方案:

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

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

因此,假设您有一个类似以下内容的列:

XXXnnnnn
    Name
    ----
    XXX01234
    XXX222
    XXX0390-A2
    XXX00965-A1
我需要一个SQL查询,它将返回这个示例列的结果,如下所示

    Number
    ------
    01234
    00222
    00390
    00965
有人有什么想法吗?我尝试过一些方法,比如先将名称转换为浮点数,然后再转换为int,但老实说,我对SQL还不够熟练,无法找到解决方案


非常感谢您的帮助

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

如果总是需要删除前3个字符,则可以执行类似操作(如果字符仅在“-”号之后开始,则可以执行此操作):

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


即使XXX可以是不同的长度,这也会起作用:

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
这可能会奏效:

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

什么是常用的数据库管理系统?对不起,我真的应该在帖子中包含它,不是吗?这是MSSQL。我将编辑这篇文章以反映这一点。作者提到他有xxxnnn或xxxnnnnnxx
SELECT RIGHT('00000'
             + SUBSTRING(Col, 1, ISNULL(NULLIF((PATINDEX('%-%', Col)), 0) - 1, LEN(Col))), 5)
FROM   (SELECT REPLACE(YourColumn, 'XXX', '') Col
        FROM   YourTable)t