Мне нужно написать функцию, которая удаляет все ведущие нули из столбца varchar. Пример: 0300 должен стать 300, а A0300 должен стать A300. Первая из них легко прекращается, но я не могу заставить вторую работать (A0300-> A300). Может ли кто-нибудь указать мне в правильном направлении?Левый ноль с SQL с символами, включенными в строку
ответ
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
В старых версиях, где 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 (имя столбца)), если вы не уверены в ведущих/конечных пробелах, поскольку мы подсчитываем количество символов он может быть более надежным.
Гнойный код, приведенный ниже, демонстрирует один способ пройти через струны с тривиальной конечной машиной для каждого и разобрать нулевое число злых. Чтобы увидеть, что происходит внутри, вы можете переключить 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
- 1. получить строку с символами
- 2. Заменить строку с символами
- 3. C# datetime to sql с включенными секундами
- 4. Создать строку с n символами
- 5. Html Кодировать строку с символами
- 6. Сравните строку с escape-символами
- 7. Деление на ноль с SQL
- 8. SQLDataReader возвращает строку с дополнительными символами прерывания \\\\
- 9. Окружать строку с двумя символами в C
- 10. Показать строку с 80 символами в TextMate
- 11. Преобразование списка с символами в строку (Python)
- 12. Инициализировать строку в Ada с нулевыми символами
- 13. Prefix.pch с включенными модулями?
- 14. Для веток с включенными
- 15. Занесенный в журнал параметризованный SQL-запрос с включенными параметрами
- 16. SQL как с дополнительными символами
- 17. Запросы с включенными в Rails
- 18. SQL Соединение с групповыми символами
- 19. SQL Удалить строку между двумя символами
- 20. PHP utf8_encode с включенными utf8
- 21. SQL Finding строки с повторяющимися символами
- 22. Как скопировать строку с несколькими нулевыми символами в строку?
- 23. Как преобразовать строку с символами Unicode в обычную строку?
- 24. Как преобразовать строку с экранированными символами в «нормальную» строку
- 25. SQL Левый/Обобщенный символ
- 26. Работа с устаревшими включенными с помощью Autoconf
- 27. stringWithFormat производит строку с тарабарщиной символами
- 28. возвращает строку json с символами html?
- 29. Log4net: добавить строку с символами после logmessage
- 30. Найти строку между двумя символами с grep
всегда начинающийся с буквы 'A' или может быть различной длины строки? –
это может быть любой символ или несколько букв, таких как ABC0150 – ImperialBert
Итак, '' zer0'' должен стать '' zer'', а '' 0'' должен стать '' ''? – HABO