powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить в строке группу символов на определенный
15 сообщений из 15, страница 1 из 1
Как заменить в строке группу символов на определенный
    #34298040
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, возможно-ли как-нибудь заменить по маске все буквы на цифры
что-то вроде replace(@a,%[^0-9]%,'*')
тоесть заменить все буквы на *,

можно конечно циклом заменить по 1 симоволу в строке, пока не будут заменены все,но ведь полюбому можно как-нить по короче :)
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298057
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
declare
@DANO varchar(1024),
@a varchar(1024)

set @DANO = 'У клиента #1(Test) скида составляет 12% процентов.'


set @a = replace(SUBSTRING(@DANO,1,CHARINDEX('%',@DANO)),' ','')


declare
@i int
set @i= patindex('%[^0-9]%',@a)

while @i >0
begin
set @a = replace(@a,SUBSTRING(@a,@i,1),'*')
set @i= patindex('%[а-я]%',@a)
if @i = 0
set @i= patindex('%[a-z]%',@a)
print @i
print @a
end

print @a



Вот этот код никак нельзя оптимизировать?
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298068
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BERSERCно ведь полюбому можно как-нить по короче :)Откуда такая уверенность?
Вы знаете метод? Зачем тогда спрашиваете? ;)
Такого "встроенного" метода нет, и думаю - никогда и не будет - реализовать его "вручную" несложно.
Можно (недокументированно, правда) - с использованием таблички с последовательностью чисел. :)

Типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @seq TABLE(ID int PRIMARY KEY)
INSERT INTO @seq SELECT number FROM master.dbo.spt_values WHERE name IS NULL

DECLARE @str varchar( 255 )
SET @str = 'wdlkrjh23lk4j2h089sudhfg234jhg09w87hsdtj5g93854g54hgkleh598h9st'

SELECT @str = CASE WHEN SUBSTRING(@str, ID,  1 ) LIKE '[^0-9]' THEN STUFF(@str, ID,  1 , '*') ELSE @str END
FROM @seq
WHERE ID BETWEEN  1  AND LEN(@str)

SELECT @str
Кстати, работает БЫСТРЕЕ, чем то же самое, но через WHILE. :)
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298087
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне на самом дела надо поучить из строки, вводимой вручную скирку в %,причем строка вводится в произвольной форме , вот кусочек кода который достаточно криво выполняет эту функцию , а как сделть этоже вышим способом?

declare
@DANO varchar(1024),
@a varchar(1024)

set @DANO = 'У клиента #1(Test) скида составляет 23 (12 %) процентов.'


set @a = replace(SUBSTRING(@DANO,1,CHARINDEX('%',@DANO)),' ','*')


declare
@i int
set @i= patindex('%[^0-9]%',@a)

while @i >0
begin
set @a = replace(@a,SUBSTRING(@a,@i,1),'*')
set @i= patindex('%[а-я]%',@a)
if @i = 0
set @i= patindex('%[a-z]%',@a)
end

set @a = replace( RIGHT(@a,PATINDEX('%[0-9][^0-9]%',REVERSE(@a )) ),'*','')

print @a
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298097
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, либо циклом, либо SQL2005
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298115
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BERSERCМне на самом дела надо поучить из строки, вводимой вручную скирку в %
Так Вам надо просто извлечь первую с начала строки непрерывную последовательность цифр?
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298124
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет мне надо извлечель последовательность цифр перед % (между ними возможно пробел будет)
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298164
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лан всем спасибо, вроде кое-как работает.
Меня кстати порадовал способ получения последовательности до 255 при помощи системной таблички :))
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298184
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BERSERCнет мне надо извлечель последовательность цифр перед % (между ними возможно пробел будет)Ну, тут все проще. :)
Итак, что нам нужно:
1 Взять строку ДО процента - это элементарно:
Код: plaintext
SET @str = SUBSTRING(@str,  1 , CHARINDEX('%', @str)- 1 )

Далее - нужно найти последнюю последовательность чисел учитывая, что она может прерываться пробелами.

Сначала можно просто вырезать пробелы:
Код: plaintext
SET @str = REPLACE(SUBSTRING(@str,  1 , CHARINDEX('%', @str)- 1 ), ' ', '')

Дальше - применяем REVERSE+PATINDEX+REVERSE:
Код: plaintext
1.
2.
3.
4.
DECLARE @str varchar( 255 )
SET @str = 'У клиента #1(Test) скида составляет 1 2% процентов.'
SET @str = REVERSE(REPLACE(SUBSTRING(@str,  1 , CHARINDEX('%', @str)- 1 ), ' ', ''))
SET @str = REVERSE(SUBSTRING(@str,  1 , PATINDEX('%[^0-9]%', @str) - 1 ))
SELECT @str
Над контролем за корректностью исходных данных - ISNUMERIC, ISNULL и прочее Вам в руки. ;)
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298190
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BERSERCЛан всем спасибо, вроде кое-как работает.
Меня кстати порадовал способ получения последовательности до 255 при помощи системной таблички :))Да этих способов - миллион. ;) И этот не самый "хороший".
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298198
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BERSERCнет мне надо извлечель последовательность цифр перед % (между ними возможно пробел будет)Пробел между самими цифрами или цифрами и %?
Если пробелы МЕЖДУ ЦИФРАМИ не нужны - можно отказаться от REPLACE и сделать все вообще в одну строку.
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298276
BERSERC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробелмы между цифрами и %, причем может быть строка типа
"скидка клиента № 1 12 %"
если мы просто уберем все пробелы то получим скидку 112 %
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #34298556
Maadox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeColo®es BERSERCЛан всем спасибо, вроде кое-как работает.
Меня кстати порадовал способ получения последовательности до 255 при помощи системной таблички :))Да этих способов - миллион. ;) И этот не самый "хороший".

Согласен, не самый "хороший".
Для таких случаев, лучше вообще иметь такую табличку в БД постоянно.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как заменить в строке группу символов на определенный
    #40002518
wizus3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на дворе 2020-ый, а майки так и не сподобились что-то типа оракловского REGEXP_REPLACE прикрутить. или я ошибаюсь? в любом случае для себя пока вот такого "монстра" использую, если кому "на коленке" подойдет. в данном случае оставляет только цифры, точку, запятую (по моей задаче). что поменять под себя - видно.

Код: sql
1.
2.
3.
4.
declare @s varchar(max)='', @i int=32
while @i<256 begin if (@i not in (48,49,50,51,52,53,54,55,56,57,44,46)) set @s=@s+char(@i) set @i=@i+1 end
select *, replace(translate(col1, @s, replicate(' ', len(@s))), ' ', '') 
from test_test



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create FUNCTION [dbo].[GetNums](@n AS BIGINT) RETURNS TABLE
AS
RETURN
  WITH
  L0   AS(SELECT 1 c UNION ALL SELECT 1),
  L1   AS(SELECT 1 c FROM L0 A CROSS JOIN L0 B),
  L2   AS(SELECT 1 c FROM L1 A CROSS JOIN L1 B),
  L3   AS(SELECT 1 c FROM L2 A CROSS JOIN L2 B),
  L4   AS(SELECT 1 c FROM L3 A CROSS JOIN L3 B),
  L5   AS(SELECT 1 c FROM L4 A CROSS JOIN L4 B),
  Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)
  SELECT TOP (@n) n FROM Nums ORDER BY n;


declare @NumericString varchar(8000) = '+20 1руб;%"23,4e5.0d98a';
select string_agg(a.letter, '')
from (select substring(@NumericString, n, 1) letter from dbo.GetNums(len(@NumericString)))a
where a.letter like '[0-9.,]'
...
Рейтинг: 0 / 0
Как заменить в строке группу символов на определенный
    #40002551
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wizus3
на дворе 2020-ый, а майки так и не сподобились что-то типа оракловского REGEXP_REPLACE прикрутить. или я ошибаюсь?

дык, CLR добавили, и после этого стало не нужно :)
FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить в строке группу символов на определенный
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]