2017-02-22 106 views
1

Мне нужно написать функцию, которая удаляет первый ведущий нуль (ы) в строке. Положение первого нуля (ов) может меняться.Обрезать ведущие нули с символом в строке

Пример один:

0000900 needs to become 900 

Пример два:

A0000900 needs to become A900 

Пример три:

ABCD00090ABC0D needs to become ABCD90ABC0D 

Пример четыре:

ABC0D00090ABC0D needs to become ABCD00090ABC0D 

Итак, первые ведущие нули, независимо от исходного положения, должны быть удалены.

Я попытался это:

DECLARE @input VARCHAR(255)= '0002981K0K' 
SELECT SUBSTRING(@input, PATINDEX('%[^0]%', @input), LEN(@input)) 

Но это приводит лишь к 2981K0K, что это хорошо. Но всякий раз, когда я добавляю нечисловое значение впереди (скажем, A), запрос больше не видит первые лидирующие нули и результаты в A0002981K0K

+0

Что происходит с 'AB0C00D000900'? – Hogan

+0

Должно получиться ABC00D000900 (удалить первый ноль). – ImperialBert

ответ

0

Можете ли вы попробовать это? Для второго результата я разделил строку на две части с префиксным нулем, затем объединим первые части с подстрокой, следуя префикс нулевой части второй части. Для AB000C00D000900, он будет разделен на AB и 000C00D000900 затем объединить AB и C00D000900 в ABC00D000900

;WITH tb(S) AS (
    SELECT 'ABCD00090ABC0D' UNION 
    SELECT '0000900' UNION 
    SELECT 'K0000900800' UNION 
    SELECT 'A0000900' UNION 
    SELECT 'AB00CD00900' UNION 
    SELECT 'AB000C00D000900' UNION 
    SELECT '0002981K0K' 
    ) 
    SELECT s,STUFF(s,PATINDEX('%0%',s),PATINDEX('%[1-9]%',s)-PATINDEX('%0%',s),'') 
      ,c.l+SUBSTRING(c.r,PATINDEX('%[^0]%',c.r),len(c.r)) 
    FROM tb 
    CROSS APPLY(VALUES(PATINDEX('%0%',s),LEFT(s,PATINDEX('%0%',s)-1),SUBSTRING(s,PATINDEX('%0%',s),LEN(s)))) c(b,l,r) 
 
s          
--------------- -------------------- ------------------------------ 
0000900   900     900 
0002981K0K  2981K0K    2981K0K 
A0000900  A900     A900 
AB00CD00900  AB900    ABCD00900 
AB000C00D000900 AB900    ABC00D000900 
ABCD00090ABC0D ABCD90ABC0D   ABCD90ABC0D 
K0000900800  K900800    K900800 

, если вы не хотите использовать кросс применить, вы можете изменить запрос:

SELECT s,LEFT(s,PATINDEX('%0%',s)-1)+SUBSTRING(SUBSTRING(s,PATINDEX('%0%',s),LEN(s)),PATINDEX('%[^0]%', SUBSTRING(s,PATINDEX('%0%',s),LEN(s))),len(s)) 
    FROM tb 
+0

'0000900800' ->' 900800', я думаю (так же, как и все примеры с 9 и нулями после). Как номер 3 – Hogan

+0

Реальный вопрос - это нули, смешанные с буквами - 'AB00CD00900' ->' ABCD900' или 'ABCD00900'? Ваш код дает 'AB900', который я считаю неправильным. – Hogan

+0

Thx для ответов ребята. Я думаю, что это работает хорошо, но Хоган, ты прав. Есть ли способ решить это? – ImperialBert