Как обрезать ведущие нули каждого значения в объединенном поле на SQL Server - PullRequest
0 голосов
/ 25 мая 2020

У меня есть требования, указанные ниже.

Входные данные:

00113|0267|0139

Ожидаемые результаты:

113|267|139

Входные данные поступают напрямую из файла, а не сгенерированное поле

На данный момент я использую приведенный ниже код, чтобы разделить поле на несколько значений, затем обрезать его с помощью функций Patindex и Substring, наконец, снова объединяя их

Substring(col, 1,charindex('|',col)-1) part1,
Substring(col,charindex('|',col)+1,(charindex('|', col, charindex('|', col, 1)+1)-charindex('|',col)-1)) part2,
Substring(col,charindex('|', col, charindex('|', col, 1)+1)+1,len(col)) part3

Сообщите мне, есть ли лучший способ добиться этого без использования этих многочисленных функций синтаксического анализа строк

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

попробуйте следующее:

declare @i int = 0

while (patindex('%|0%', '|'+@str) > 0)
begin
    set @str = ( replace(substring('|'+ @str, 1, patindex('%|0%', '|'+@str)+1 ), '|0', '|') + substring(@str, patindex('%|0%', '|'+@str)+1, len(@str)) )
    set @i += 1
end

select stuff(@str, 1, @i, '')

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

select STUFF((SELECT  '|' + convert(varchar(100), convert(int, nullif(value, '')))
                  FROM string_split(@str, '|') t
                   FOR XML PATH ('')) , 1, 1, '') Grouped_Value

пожалуйста, найдите db <> fiddle здесь .

0 голосов
/ 25 мая 2020

один из вариантов - просто использовать replace ()

Пример

Declare @YourTable Table ([SomeCol] varchar(50))  Insert Into @YourTable Values 
 ('00113|0267|0139')

Select * 
      ,NewVal = stuff(replace(replace(replace('|'+SomeCol,'|0','|'),'|0','|'),'|0','|'),1,1,'')
 From @YourTable

Возвращает

SomeCol          NewVal
00113|0267|0139  113|267|139
...