Ведущие нули после получения числовой части строки - PullRequest
0 голосов
/ 10 октября 2018

SQL Server 2012. Необходимо получить числовую часть из 6 цифр, если цифр недостаточно, заполните начальными нулями.Код типа nvarchar.

TABLE_A Перед обновлением

Id  Code
1  s33404tft 
2  dd345ui
3  456567t
4  8746

TABLE_A После обновления

Id  Code
1  033404
2  000345
3  456567
4  008746   

sql скрипт:

 Update table_A
    SET Code=FORMAT((SELECT SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) AS Number 
              FROM Table_A),'000000')

Не имеетРабота.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Одним из способов является объединение ведущих нулей и использование RIGHT для извлечения желаемого значения:

UPDATE table_A
SET Code =
    RIGHT('000000' + SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1), 6)
    FROM Table_A;
0 голосов
/ 10 октября 2018

FORMAT не работает с типами текста.Извлеченная числовая часть должна быть сначала преобразована в целое число, чтобы отформатировать ее, например:

update Table_A
set code=FORMAT(cast( SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) 
                      as int)
                ,'00000000')

Например:

declare @table_A table (ID int, Code nvarchar(20))
insert into @table_A (ID,Code)
values
(1,'s33404tft'),
(2,'dd345ui'),
(3,'456567t'),
(4,'8746');

update @table_A
set code=FORMAT(cast(SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) as int)
                ,'00000000')


select * from @table_A

Производит:

ID  Code
1   00033404
2   00000345
3   00456567
4   00008746
0 голосов
/ 10 октября 2018

Вы можете использовать функцию репликации для заполнения начальных нулей в SQL

Пожалуйста, проверьте указанный документ для функции USD udfLeftSQLPadding Затем вы можете использовать его в следующем формате:

select dbo.udfLeftSQLPadding('12345',6,'0')

Кроме того, чтобы получить только числовые значения, вы можете использовать ClearNonNumericCharacters UDF, где я поделился на Удалить нечисловой символ

Таким образом, ваш скрипт будет выглядеть следующим образом

Update table_A
set 
Code = dbo.udfLeftSQLPadding( dbo.ClearNonNumericCharacters(Code), 6, '0')
...