2015-02-13 11 views
0

У меня есть этот тип строкКак удалить первые N конкретные символы, если они все нули

01/CBA/1234567890 
02/ABC/0000969755 
06/DEF/0000000756 

Я хочу, чтобы удалить нули и получить следующий вывод

01/CBA/1234567890 
02/ABC/969755 
06/DEF/756 

Как я могу это сделать ? Я, однако, о комбинации функций RIGHT, LEFT, CHARINDEX, SUBSTRING, но не знаю, как их объединить.

Любая идея?

+1

http://stackoverflow.com/questions/92093/removing-leading-zeroes-from-a-field-in-a-sql-statement –

ответ

1

Вы можете использовать что-то вроде этого:

SUBSTRING(myString, PATINDEX('%[^0]%', myString+'.'), LEN(myString)) 
+1

Спасибо это работает: -) declare @str as varchar (20) = '02/ABC/0000969755 ' выберите LEFT (@ str, 7) + SUBSTRING (RIGHT (@ str, 10), PATINDEX ('% [^ 0]% ', RIGHT (@ str, 10) + '.'), LEN (RIGHT (@ str, 10))) но почему существует эта точка?: P – Muflix

1

Попробуйте этот один

метод 1

DECLARE @STR VARCHAR(100)= '02/ABC/0000969755' 

SELECT SUBSTRING(@STR,0,LEN(@STR) - CHARINDEX('/', REVERSE(@STR)) + 2)+ 
CAST(CAST(REVERSE(SUBSTRING(REVERSE(@STR),0,CHARINDEX('/',REVERSE(@STR))))AS INT)AS VARCHAR(20)) 
  • Click here для просмотра результат

Метод 2

DECLARE @STR VARCHAR(100)= '02/ABC/0000969755' 


;WITH CTE AS 
(
    -- Convert to rows 
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) RNO, 
    LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'STRING' 
    FROM 
    (  
     SELECT CAST ('<M>' + REPLACE(@STR, '/', '</M><M>') + '</M>' AS XML) AS Data  
    ) AS A 
    CROSS APPLY Data.nodes ('/M') AS Split(a) 
) 
,CTE2 AS 
(
    -- Convert to int and then varchar 
    SELECT RNO,CASE WHEN RNO = 3 THEN CAST(CAST(STRING AS INT)AS VARCHAR(40)) ELSE STRING END STRR 
    FROM CTE 
) 
-- Convert back to/separated values 
SELECT SUBSTRING(
     (SELECT '/ ' + STRR 
      FROM CTE2    
      ORDER BY RNO 
      FOR XML PATH('')),2,200000) STRING 
  • Click here для рабочего раствора
+0

Я обновил @Muflix –

+0

woah так сложно, но работал, спасибо: -) – Muflix

+0

См. Первый встреченный корыто. Это не сложно. Кстати, я просто дал способ выполнить их разными способами. @Muflix –

1

Ниже Query поможет вам

DECLARE @var VARCHAR(500) = '06/DEF/0000000756' 
SELECT 
    LEFT(@var, CHARINDEX('/',@var)) + 
    LEFT(REPLACE(@var, LEFT(@var, CHARINDEX('/',@var)),''), 
     CHARINDEX('/',REPLACE(@var, LEFT(@var, CHARINDEX('/',@var)) ,''))) 
            + 
CONVERT(varchar, CONVERT(numeric(18,0),REPLACE(REPLACE(@var,LEFT(@var, 
     CHARINDEX('/',@var)),''),Left(REPLACE(@var,LEFT(@var, 
     CHARINDEX('/',@var)) ,''), 
     CHARINDEX('/',REPLACE(@var,LEFT(@var, 
     CHARINDEX('/',@var)),''))),''))) 
1

использование левой и правой строки функции

DECLARE @str varchar(20)='06/DEF/0000000756' 
SELECT left(@str,7)+convert(varchar(20),convert(int,right(@str,10))) 

enter image description here

+0

хороший трюк с конвертированием, спасибо :-) – Muflix

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