在这种情况下,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来找到解决方案。
非常感谢任何帮助!
答案 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