用于从名称解析数字的SQL查询
本例中的DBMS是SQL Server 2012 我需要一个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 ----
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