Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена любого символа в строке / 15 сообщений из 15, страница 1 из 1
07.05.2018, 04:14
    #39641173
Замена любого символа в строке
Доброго времени суток
Прошу совета - как заменить любые несколько неизвестных заранее символов на такое же количество например звездочек?
Причем, без использования переменных и рекурсии.


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

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



Заранее благодарен.
...
Рейтинг: 0 / 0
07.05.2018, 07:42
    #39641189
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
Дык, заменяй на 7 (семь) звездочек, вместо одной.

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

Код: sql
1.
replicate('*', 7)
...
Рейтинг: 0 / 0
07.05.2018, 14:30
    #39641421
Замена любого символа в строке
aleks222Дык, заменяй на 7 (семь) звездочек, вместо одной.

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

Код: sql
1.
replicate('*', 7)



Спасибо, добрый человек.
про replicate не знал, полезная штука.
...
Рейтинг: 0 / 0
07.05.2018, 14:34
    #39641429
Замена любого символа в строке
А может быть можно как-то по шаблону заменять одни символы на другие?

Потому что для варианта 'моя длинная длинная строка' мое решение уже не подходит.
Нужно, чтобы было 'моя ******* ******* строка'
То есть пробелы сохранить.
...
Рейтинг: 0 / 0
07.05.2018, 14:36
    #39641431
Замена любого символа в строке
Гордон Шамуэй,

Ессно, чтобы работало и для варианта 'моя очень длинная длинная строка' и т. д.
...
Рейтинг: 0 / 0
07.05.2018, 15:55
    #39641518
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
Гордон ШамуэйГордон Шамуэй,

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

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

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

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

Правда, "неизвестных заранее символов" - это сильно портит дело.
...
Рейтинг: 0 / 0
07.05.2018, 15:57
    #39641520
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
Пардон, был невнимателен...

STRING_SPLIT + сборка обратно.
...
Рейтинг: 0 / 0
07.05.2018, 16:14
    #39641539
Замена любого символа в строке
aleks222Пардон, был невнимателен...

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

STRING_SPLIT появилась только в 2016
CTE быть не должно.
...
Рейтинг: 0 / 0
07.05.2018, 17:27
    #39641607
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
CTE можно заменить FOR XML PATH.
Split - написать самому.
...
Рейтинг: 0 / 0
07.05.2018, 18:17
    #39641631
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
Гордон Шамуэй,

Если Split самому писать не хочется, за вас его может сделать xml.
Как-то так:
Код: sql
1.
2.
3.
4.
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('')


Чтобы выглядело более читаемо, в примере первое и последнее слово отделять не стала.
...
Рейтинг: 0 / 0
08.05.2018, 00:30
    #39641722
Замена любого символа в строке
Eleanor,

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

И еще, поскольку данные нужно брать из реальной таблицы, то есть вместо "моя самая длинная строка" будет какой-нибудь column1,
куда вставлять выражение FROM table?
...
Рейтинг: 0 / 0
08.05.2018, 01:28
    #39641736
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
EleanorЕсли Split самому писать не хочется, за вас его может сделать xml.только вот скорость работы у этого
Код: sql
1.
'for $i in ...'

не особо...
...
Рейтинг: 0 / 0
08.05.2018, 11:23
    #39641897
НиколайСН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
а чем стандартное решение по "replacce" тебя не устраивает?

Код: sql
1.
2.
SELECT REPLACE('моя длинная строка', 'длинная', '*******');
SELECT REPLACE('моя длинная длинная строка', 'длинная', '*******');



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

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

зато будет возможность увеличивать количество этих символов для замены на '****'
...
Рейтинг: 0 / 0
08.05.2018, 13:09
    #39641981
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена любого символа в строке
Гордон ШамуэйА где можно об этом почитать?

Почитать можно в документации. 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 отличается не самой высокой скоростью, как уже отметил Дедушка.
...
Рейтинг: 0 / 0
10.05.2018, 02:32
    #39642441
Замена любого символа в строке
Eleanor,

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


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