Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удалить заданные символы из строки слева  [new]
Denis Bahiya
Member

Откуда: Саратов
Сообщений: 14
Доброго времени суток.

Есть строка вида '0000000204587' - как внутри хранимой процедуры можно убрать из неё все нули слева?

Покопался в строковых функциях T-SQL и не обнаружил ничего похожего :-(
8 окт 12, 21:01    [13287182]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
REVERSE +LEFT
8 окт 12, 21:15    [13287237]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Denis Bahiya
Member

Откуда: Саратов
Сообщений: 14
Maxx
REVERSE +LEFT

Этот вариант сработал, если бы было известно число символов, а в моём случае неизвестна ни длина самой строки, ни количество символов отличных от '0'
8 окт 12, 21:22    [13287272]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
replace(ltrim(replace(строка, '0', ' ')), ' ', 0)
8 окт 12, 21:30    [13287306]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Denis Bahiya
Member

Откуда: Саратов
Сообщений: 14
invm
replace(ltrim(replace(строка, '0', ' ')), ' ', 0)


Все нули превратили в пробелы, обрезали все пробелы слева и те пробелы что внутри оставшейся строки заменили нулями.

invm - большое спасибо!
8 окт 12, 21:37    [13287331]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Denis Bahiya,

А если в строке всегда число, то например так

select cast(cast('0000000204587' as int) as varchar(13))
9 окт 12, 00:53    [13287857]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
облом-с
Guest
Alexander Titkin
Denis Bahiya,

А если в строке всегда число, то например так

select cast(cast('0000000204587' as int) as varchar(13))


а если в строке всегда число, но цифр в нем штук 50, то облом с int-ом
9 окт 12, 01:20    [13287900]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
облом-с,

Берем подходящий числовой тип и подходящую длину varchar, при отсутствии подходящего типа не используем предложенный метод.
Судя по строке от ТС она очень похожа на номер какой-то накладной и надо очень извратится сделав его на 50 позиций
9 окт 12, 08:38    [13288150]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Denis Bahiya
Member

Откуда: Саратов
Сообщений: 14
Alexander Titkin
select cast(cast('0000000204587' as int) as varchar(13))
В моем случае и этот вариант прекрасно работает - большое спасибо.

Работаю со штрих-кодом EAN13 (пример: 2401000000294, где 1,2,3 и 4 цифры несут служебную информацию, последняя 13 контрольное число). Задача - извлечь порядковый номер из оставшихся символов.
Благодаря вашей помощи имею два варианта:

1. SELECT (CONVERT(INT, REPLACE(LTRIM(REPLACE(SUBSTRING('2401000000294', 5 , 8), '0', ' ')), ' ', 0)))


2. SELECT CAST(CAST(SUBSTRING('2401000000294', 5, 8) AS INT) AS VARCHAR(13))


Захотелось сравнить производительность этих вариантов. Большим объемом данных не располагаю, поэтому создал запросы под каждый из вариантов, в каждом по 1000 одинаковых строк. Результат выполнения:
1. 50 секунд
2. 56 секунд

Всем спасибо за ответы.
9 окт 12, 09:00    [13288196]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Denis Bahiya
Результат выполнения:
1. 50 секунд
2. 56 секунд
???
А не милисекунд?
9 окт 12, 09:11    [13288230]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Denis Bahiya,

У меня другие результаты

set nocount on
select top 1000000 replicate('0', 13 - len(row_number() over(order by a.name)))  + cast( row_number() over(order by a.name) as varchar(13)) as number
into #tmp
from sys.objects a
cross join sys.objects b
cross join sys.objects c

set statistics time on
select (convert(int, replace(ltrim(replace(substring(n.number, 5 , 8), '0', ' ')), ' ', 0)))
from #tmp n

select cast(cast(substring(n.number, 5, 8) as int) as varchar(13))
from #tmp n
set statistics time off

drop table #tmp


SQL Server Execution Times:
CPU time = 3994 ms, elapsed time = 4606 ms.

SQL Server Execution Times:
CPU time = 717 ms, elapsed time = 3667 ms.

соответственно
9 окт 12, 11:18    [13288942]     Ответить | Цитировать Сообщить модератору
 Re: Удалить заданные символы из строки слева  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alexander Titkin
Denis Bahiya,

У меня другие результаты

set nocount on
select top 1000000 replicate('0', 13 - len(row_number() over(order by a.name)))  + cast( row_number() over(order by a.name) as varchar(13)) as number
into #tmp
from sys.objects a
cross join sys.objects b
cross join sys.objects c

set statistics time on
select (convert(int, replace(ltrim(replace(substring(n.number, 5 , 8), '0', ' ')), ' ', 0)))
from #tmp n

select cast(cast(substring(n.number, 5, 8) as int) as varchar(13))
from #tmp n
set statistics time off

drop table #tmp


SQL Server Execution Times:
CPU time = 3994 ms, elapsed time = 4606 ms.

SQL Server Execution Times:
CPU time = 717 ms, elapsed time = 3667 ms.

соответственно
Первый запрос зачем-то преобразует результат к типу int,
второй - к типу varchar(13)....
Что сравнваем-то? Алебастр с астролябией?

Интересная методика
9 окт 12, 21:36    [13292739]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить