Удаление начальных нулей, часть 2

SQL Server 2012

У меня есть 3 столбца в моей таблице, которые будут использовать функцию. '[usr].[Udf_OverPunch]'. и подстрока.

Вот мой код:

[usr].[Udf_OverPunch](SUBSTRING(col001, 184, 11)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT

Эта функция работает надлежащим образом для того, что мне нужно. В основном это преобразование символов или букв в назначенное число на основе словаря данных.

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

Это то, что я использую, чтобы избавиться от ведущих нулей (но оставить один ноль) в моем коде для других столбцов:

cast(cast(SUBSTRING(col001, 217, 6) as int) as varchar(25)) as PREVIOUS_REPORTING_PERIOD

Это хорошо работает при преобразовании значения «000000» в один «0» или значения «000060» в «60», но не будет работать с функцией из-за символа или буквы (при попытке преобразования в int).

Как я уже упоминал, у меня есть 3 столбца, которые выдают значения, которые выглядят примерно так, когда функция не используется:

'0000019753{'
'0000019748G'
'0000019763H'

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

Это то, что я пытался сделать, но это не работает, потому что значение содержит символ, который не является целым числом:

[usr].[Udf_OverPunch]cast(cast(SUBSTRING(col001, 184, 6) as int) as varchar(25)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT,

Пожалуйста, дайте мне знать, если у вас есть идеи или вам нужна дополнительная информация. :)


person Gregory Brauninger    schedule 03.11.2016    source источник
comment
Тут срочно нужен совет. Это нужно сделать до завтра. Осталось только завершить весь процесс.   -  person Gregory Brauninger    schedule 04.11.2016
comment
Я ответил на ваш вопрос, однако в зависимости от ваших данных может быть гораздо более чистое решение. Всегда ли он одинаковой длины? всегда состоит из цифр и + одного нецифрового символа в конце?   -  person David דודו Markovitz    schedule 04.11.2016


Ответы (3)


Я обрабатываю такую ​​​​замену с помощью функции T-SQL CLR, которая позволяет выполнять замену с использованием регулярных выражений. Итак, решение будет таким:

[dbo].[fn_Utils_RegexReplace] ([value], '^0{1,}(?=.)', '')

Вам необходимо создать такую ​​функцию, потому что в T-SQL (встроенной) нет поддержки регулярных выражений.

Как создать функцию замены регулярного выражения в T-SQL?

Например:

введите здесь описание изображения

person gotqn    schedule 04.11.2016

попробуй это,

declare @i varchar(50)='0000019753}'--'0000019753'

select case when ISNUMERIC(@i)=1 then 
cast(cast(@i as bigint) as varchar(50)) else @i end

or

[usr].[Udf_OverPunch]( case when ISNUMERIC(col001)=1 then 
cast(cast(col001 as bigint) as varchar(50)) else col001 end)
person KumarHarsh    schedule 04.11.2016
comment
[usr].[Udf_OverPunch](case when ISNUMERIC((SUBSTRING(col001, 206, 11))=1 then cast(cast((SUBSTRING(col001, 206, 11) as bigint) as varchar(50)) else (SUBSTRING(col001, 206, 11) end) as GAP_DISCOUNT_AMOUNT_THIS_PERIOD, Здесь возникают синтаксические ошибки @kumarharsh - person Gregory Brauninger; 04.11.2016

person    schedule
comment
У меня возникли проблемы с тем, чтобы моя функция работала с этим. - person Gregory Brauninger; 04.11.2016
comment
@GregoryBrauninger - это проверенный код. Не могли бы вы уточнить? - person David דודו Markovitz; 04.11.2016
comment
@GregoryBrauninger, я ничего не могу сделать с этой информацией. Вы получаете ошибку? Вы получаете неожиданные результаты? можете дать образец строки? - person David דודו Markovitz; 04.11.2016
comment
Я пытаюсь правильно отформатировать этот комментарий. Ведущие нули и остающийся только один ноль работают отлично. Проблема в том, что моя функция не выполняется, поэтому у меня осталось: @Dudu '13962{' '17801H' '2969G' - person Gregory Brauninger; 04.11.2016
comment
Все отлично, мне просто нужно использовать мою функцию ([usr].[Udf_OverPunch]). @Dude Markovitz - person Gregory Brauninger; 04.11.2016
comment
case when [usr].[Udf_OverPunch](SUBSTRING(col001, 206, 11)) like '%[^0]%' then substring((SUBSTRING(col001, 206, 11)),patindex('%[^0]%',(SUBSTRING(col001, 206, 11))),len((SUBSTRING(col001, 206, 11)))) when [usr].[Udf_OverPunch](SUBSTRING(col001, 206, 11)) like '%0%' then '0' else [usr].[Udf_OverPunch](SUBSTRING(col001, 206, 11)) end as GAP_DISCOUNT_AMOUNT_THIS_PERIOD, @Чувак, это самое близкое, что у меня было. Все работает, но функция не выполняет свою работу. - person Gregory Brauninger; 04.11.2016
comment
Предполагается, что функция превращает символы в выходных значениях в определенное число (все это включено в код функции). Просто не выполняется. Вот несколько примеров: «13962{», «17801H», «2969G». Это должно быть как «139620», «178015», 29698, «. Я уверен, что функция работает, просто не работает с кодом выше. @Дуду Марковиц - person Gregory Brauninger; 04.11.2016
comment
Ваша кодировка работает, чтобы изменить "000013962{" на "13962{" и "0000000" на "0". Это здорово, мне просто нужна функция для работы с ним, чтобы заменить символ. - person Gregory Brauninger; 04.11.2016
comment
@GregoryBrauninger, пожалуйста, пришлите мне свой код по почте, включая определение таблицы с некоторыми примерами строк (инструкция INSERT) - person David דודו Markovitz; 04.11.2016
comment
Я использовал код в своем комментарии выше, который вы мне предоставили. Но я убрал эту функцию. Затем я поместил все во временную таблицу и вызвал функцию. Все работает сейчас. Огромное спасибо! - person Gregory Brauninger; 04.11.2016