2015-03-26 2 views
0

СУБД в этом случае SQL Server 2012.SQL запросов для анализа чисел от имени

мне нужен SQL запрос, который будет захватывать только цифры от имени устройства. У меня есть устройства, которые следуют схеме именования, которая должна выглядеть следующим образом:

XXXnnnnn 

или

XXXnnnnn-XX 

Где X это буква и п число, которое должно быть оставлено дополненными 0, где уместно , Однако не все имена правильно заполняются таким образом.

Итак, представьте, что вы есть столбец, который выглядит примерно так:

Name 
    ---- 
    XXX
    XXX222 
    XXX0390-A2 
    XXX00965-A1 

Мне нужно запрос SQL, который будет возвращать результаты из этого примера колонки следующим образом.

Number 
    ------ 

    00222 
    00390 
    00965 

У кого-нибудь есть мысли? Я пробовал такие вещи, как литье имени сначала как float, а затем как int, но, честно говоря, я просто недостаточно квалифицирован для SQL, но для решения проблемы.

Любая помощь очень ценится!

+1

Что такое используется СУБД? –

+0

Извините, я действительно должен был включить это в сообщение, не так ли? Это MSSQL. Я отредактирую сообщение, чтобы это отразить. –

ответ

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 
0

Если первые 3 символов всегда необходимо удалить, то вы можете сделать что-то подобное (будет работать, если персонажи начнут только после того, как '-' знак):

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

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

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

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 

    00222 
    00390 
    00965 
0

Это будет работать даже тогда, когда XXX может быть различных Len:

DECLARE @t TABLE (n NVARCHAR(50)) 

INSERT INTO @t 
VALUES ('XXXXXXX'), 
     ('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 

00222 
00390 
00965 
+0

Он не будет работать с A10 –

+0

Автор упомянул, что у него есть XXXnnnnn или XXXnnnnn-XX –

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

Смежные вопросы