2017-02-21 8 views
0

Мне нужно написать функцию, которая удаляет все ведущие нули из столбца varchar. Пример: 0300 должен стать 300, а A0300 должен стать A300. Первая из них легко прекращается, но я не могу заставить вторую работать (A0300-> A300). Может ли кто-нибудь указать мне в правильном направлении?Левый ноль с SQL с символами, включенными в строку

+0

всегда начинающийся с буквы 'A' или может быть различной длины строки? –

+0

это может быть любой символ или несколько букв, таких как ABC0150 – ImperialBert

+0

Итак, '' zer0'' должен стать '' zer'', а '' 0'' должен стать '' ''? – HABO

ответ

1
WITH test AS 
(
    SELECT 'A0300' AS code 
    UNION 
    SELECT '0300' 
), 
strip AS (
SELECT code, SUBSTRING(code, PATINDEX('%[0-9]%', code), LEN(code)) AS number 
from test 
) 

select REPLACE(code, number, CAST(number as INT)) 
FROM strip 
0

В старых версиях, где PATINDEX не работает, или если PATINDEX слишком медленно:

ли дело и использовать LIKE '[0-9]'/NOT LIKE '[0-9]' найти правильную точку расщепления - если вы знаете максимальную длину своей строки, чтобы вы могли подготовить столько случаев, сколько необходимо. Вы находите правильный правый номер символа, где начинается число, и отбрасывайте правую часть как INT, чтобы исключить ведущее 0, а затем произведите результат как VARCHAR для повторной агрегации с вашей главной буквой (-ами).

бы сделать что-то, как показано ниже: ВЫБРАТЬ СЛУЧАЙ КОГДА ВЛЕВО (имя_столбца, 1) NOT LIKE '[0-9]' И SUBSTRING (ColumnName, 2,1) LIKE '[0-9]' ТОГДА LEFT (имя столбца, 1) + CAST (CAST (SUBSTRING (2, (LEN (имя столбца) -2)) AS INT) AS VARCHAR (25)) КОГДА LEFT (имя столбца, 2) НЕ НРАВИТСЯ '[0-9]' И СУБСТРИРОВАТЬ (columnname, 3,1) .... END

Вы должны обрезать пробелы с помощью LTRIM (RTRIM (имя столбца)), если вы не уверены в ведущих/конечных пробелах, поскольку мы подсчитываем количество символов он может быть более надежным.

0

Гнойный код, приведенный ниже, демонстрирует один способ пройти через струны с тривиальной конечной машиной для каждого и разобрать нулевое число злых. Чтобы увидеть, что происходит внутри, вы можете переключить select s после CTE.

-- Sample data. 
declare @Samples as Table (SampleId Int Identity, Sample VarChar(100)); 
insert into @Samples (Sample) values 
    ('0300'), ('A0300'), ('zer0'), ('0'), ('000'), ('00000Q050098'); 
select * from @Samples; 

-- Fiendish thingy. 
declare @False as Bit = 0, @True as Bit = 1; 
with 
    Characters as (
    select SampleId, Sample, 1 as Position, Substring(Sample, 1, 1) as Character, 
     case when Substring(Sample, 1, 1) = '0' then @True else @False end as IsZero, 
     case when Substring(Sample, 1, 1) = '0' then @True else @False end as FirstZeroes 
     from @Samples 
    union all 
    select SampleId, Sample, Position + 1, Substring(Sample, Position + 1, 1), 
     case when Substring(Sample, Position + 1, 1) = '0' then @True else @False end, 
     case 
     when FirstZeroes is NULL then NULL -- We're done with this string. 
     when FirstZeroes = @True and Substring(Sample, Position + 1, 1) <> '0' then NULL -- We just finished with this string. 
     when Substring(Sample, Position + 1, 1) = '0' then @True -- We're (still) going with this string. 
     else @False end 
     from Characters 
     where Position < Len(Sample)) 
-- select * from Characters order by SampleId, Position; -- Use this statement to see the intermediate results. 
    select C.SampleId, C.Sample, 
    Coalesce(Stuff((select Character from Characters where SampleId = C.SampleId and (FirstZeroes = 0 or FirstZeroes is NULL) order by Position for XML path(''), type).value('.[1]', 'VarChar(max)'), 1, 0, ''), '') as DeZeroed 
    from Characters as C 
    group by SampleId, Sample 
Смежные вопросы