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

Откуда:
Сообщений: 34
Доброго времени суток
Прошу совета - как заменить любые несколько неизвестных заранее символов на такое же количество например звездочек?
Причем, без использования переменных и рекурсии.


Мой запрос подставляет один символ '*', а надо подставить 7 штук, по количеству букв.
Есть какой то способ?

SELECT 'моя длинная строка', 
CHARINDEX(' ','моя длинная строка') AS Index_From, CHARINDEX(' ',REVERSE('моя длинная строка')) AS Index_From_The_End_To ,
STUFF('моя длинная строка', CHARINDEX(' ','моя длинная строка')+1, LEN('моя длинная строка')-CHARINDEX(' ',REVERSE('моя длинная строка'))-CHARINDEX(' ','моя длинная строка'), '*') AS '****'


Заранее благодарен.
7 май 18, 04:14    [21391913]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
aleks222
Member

Откуда:
Сообщений: 952
Дык, заменяй на 7 (семь) звездочек, вместо одной.

В чем проблема то?

replicate('*', 7)
7 май 18, 07:42    [21391950]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
aleks222
Дык, заменяй на 7 (семь) звездочек, вместо одной.

В чем проблема то?

replicate('*', 7)


Спасибо, добрый человек.
про replicate не знал, полезная штука.
7 май 18, 14:30    [21393205]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
А может быть можно как-то по шаблону заменять одни символы на другие?

Потому что для варианта 'моя длинная длинная строка' мое решение уже не подходит.
Нужно, чтобы было 'моя ******* ******* строка'
То есть пробелы сохранить.
7 май 18, 14:34    [21393217]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Гордон Шамуэй,

Ессно, чтобы работало и для варианта 'моя очень длинная длинная строка' и т. д.
7 май 18, 14:36    [21393221]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
aleks222
Member

Откуда:
Сообщений: 952
Гордон Шамуэй
Гордон Шамуэй,

Ессно, чтобы работало и для варианта 'моя очень длинная длинная строка' и т. д.


Дык, табличка с заменами?

'длинная', '******'

и replace в цикле или CTE.

Правда, "неизвестных заранее символов" - это сильно портит дело.
7 май 18, 15:55    [21393446]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
aleks222
Member

Откуда:
Сообщений: 952
Пардон, был невнимателен...

STRING_SPLIT + сборка обратно.
7 май 18, 15:57    [21393456]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
aleks222
Пардон, был невнимателен...

STRING_SPLIT + сборка обратно.


STRING_SPLIT появилась только в 2016
CTE быть не должно.
7 май 18, 16:14    [21393513]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
aleks222
Member

Откуда:
Сообщений: 952
CTE можно заменить FOR XML PATH.
Split - написать самому.
7 май 18, 17:27    [21393742]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Eleanor
Member

Откуда:
Сообщений: 2865
Гордон Шамуэй,

Если Split самому писать не хочется, за вас его может сделать xml.
Как-то так:
SELECT ' ' +REPLICATE('*', f.value('.', 'int'))
FROM
(SELECT CONVERT(xml,REPLACE('<a>'+'моя самая длинная строка'+'</a>', ' ', '</a><a>')).query('for $i in //a return <b>{fn:string-length($i)}</b>')) AS C(d)
CROSS APPLY d.nodes('/b') E(f) FOR XML PATH('')

Чтобы выглядело более читаемо, в примере первое и последнее слово отделять не стала.
7 май 18, 18:17    [21393910]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Eleanor,

Спасибо, интересное решение. Совсем ничего об этом не знаю.
А где можно об этом почитать?
Или можете объяснить на пальцах что в этом коде происходит?

И еще, поскольку данные нужно брать из реальной таблицы, то есть вместо "моя самая длинная строка" будет какой-нибудь column1,
куда вставлять выражение FROM table?
8 май 18, 00:30    [21394501]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Eleanor
Если Split самому писать не хочется, за вас его может сделать xml.
только вот скорость работы у этого
'for $i in ...'
не особо...
8 май 18, 01:28    [21394544]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
а чем стандартное решение по "replacce" тебя не устраивает?

SELECT REPLACE('моя длинная строка', 'длинная', '*******');
SELECT REPLACE('моя длинная длинная строка', 'длинная', '*******');


Ну а если есть возможность создать табличку с полями: ReplaceFrom и ReplaceTo, то можно обернуть в cursor.

Еще вариант написать некую функцию, где параметрами будет выступать твое поле из таблицы и далее писать select используя твою функцию.

зато будет возможность увеличивать количество этих символов для замены на '****'
8 май 18, 11:23    [21395203]     Ответить | Цитировать Сообщить модератору
 Re: Замена любого символа в строке  [new]
Eleanor
Member

Откуда:
Сообщений: 2865
Гордон Шамуэй
А где можно об этом почитать?

Почитать можно в документации. Sql Server реализовал довольно большую часть стандарта xml:
  • Функции query и nodes
  • То, что пишется внутри функций query и nodes - это выражения XPath. XPath - это часть стандартного языка запросов к xml, XQuery.
  • В частности, обработка по циклу for $i in - это синтаксис FLWOR

    Или можно почитать книгу Pro SQL Server 2008 XML

    Гордон Шамуэй
    Или можете объяснить на пальцах что в этом коде происходит?

  • Строка 'моя длинная строка' искусственно превращается в xml вида
    <a>моя</a><a>длинная</a><a>строка</a>.
  • По циклу для каждого нода "а" вычисляется длина, находящегося там слова, и возвращается в виде
    <b>3</b><b>7</b><b>6</b>.
  • Производится преобразование xml в таблицу со значениями 3, 7, 6
  • Функция REPLICATE заменяет значения в таблице на ***, *******, ******.
  • Значения таблицы сворачиваются в строку через пробел с помощью FOR XML PATH.

    Если у вас это рабочий код, то лучше все-таки написать свою функцию split, т.к. работа с xml в Sql Server отличается не самой высокой скоростью, как уже отметил Дедушка.
  • 8 май 18, 13:09    [21395704]     Ответить | Цитировать Сообщить модератору
     Re: Замена любого символа в строке  [new]
    Гордон Шамуэй
    Member

    Откуда:
    Сообщений: 34
    Eleanor,

    Спасибо большое за информацию!
    10 май 18, 02:32    [21398848]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить