Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вопрос по строковым функциям с заменой  [new]
гость123
Guest
Здравствуйте!
Необходимо заменить буквы между двумя пробелами на знаки '*'
Дано:
test test test
aaa a a

Получить:
test **** test
aaa * a

Подскажите как это можно сделать?
Я пока придумал как вытаскивать первое и последнее слово:
SELECT name,
SUBSTRING(name,1, CHARINDEX(' ', name))+
RIGHT(name, LEN(name) - CHARINDEX(' ', name, CHARINDEX(' ', name)+1))
FROM A

Заранее спасибо за любую подсказку!
2 окт 09, 16:26    [7736202]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
гость123,

SELECT
	name
	,SUBSTRING(name,1, CHARINDEX(' ', name))
	+replicate('*',len(SUBSTRING(name,CHARINDEX(' ', name)+1,CHARINDEX(' ', name, CHARINDEX(' ', name)+1)-CHARINDEX(' ', name))))
	+RIGHT(name, LEN(name) - CHARINDEX(' ', name, CHARINDEX(' ', name)+1)+1)
FROM(
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
	)A
2 окт 09, 16:34    [7736244]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
iiyama
Member

Откуда:
Сообщений: 642
А что должно получится если test test test test test?
2 окт 09, 16:45    [7736329]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
Сергей Мишин, спасибо.
Вот мой вариант

SELECT name, 
SUBSTRING(name,1, CHARINDEX(' ', name))+
REPLICATE('*',CHARINDEX(' ', name, CHARINDEX(' ', name)+1) - CHARINDEX(' ', name)-1)+' '+
RIGHT(ship, LEN(name) - CHARINDEX(' ', name, CHARINDEX(' ', name)+1))
FROM(
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
	)A

Но оба варианта не подходят для такой выборки:
SELECT 'test test test' name
UNION ALL SELECT 'aaa a a'
UNION ALL SELECT ' '
)A
Т.е. есть 3 подряд пробела. А нужно соответственно между двумя пробелами заменить и получить ' * '
Заранее спасибо за подсказку!
2 окт 09, 16:48    [7736350]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
iiyama
А что должно получится если test test test test test?

Должно получиться: test ***************test
Т.е. нужно заменить все символы между первым и последним пробелом...
Вот сижу ломаю голову не один час :)
2 окт 09, 16:50    [7736365]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
гость123
iiyama
А что должно получится если test test test test test?

Должно получиться: test ***************test
Т.е. нужно заменить все символы между первым и последним пробелом...
Вот сижу ломаю голову не один час :)

т.е. test *************** test
Если кто знает подскажите, все нужно сделать используя только селект и строковые функции.
2 окт 09, 16:51    [7736376]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
        UNION ALL SELECT 'test test test test'
        UNION ALL SELECT '   '
Получить:
test **** test
aaa * a
test ********* test
*
2 окт 09, 16:54    [7736396]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
iiyama
Member

Откуда:
Сообщений: 642
?
SELECT
STUFF(name,CHARINDEX(' ', name)+1, LEN(NAME)-CHARINDEX(' ', REVERSE(name))-CHARINDEX(' ', name),REPLICATE('*', LEN(NAME)-CHARINDEX(' ', REVERSE(name))-CHARINDEX(' ', name)))
FROM(
	SELECT 'test test test test' name
	UNION ALL SELECT 'aa aa aa'
	)A
PS. Только надо проверить что пробелы есть
2 окт 09, 17:01    [7736434]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
гость123,

SELECT
	name
	,IsNull(
		LEFT(name,CHARINDEX(' ', name))
		+replicate('*',len(name)-CHARINDEX(' ', reverse(name))-CHARINDEX(' ', name))
		+RIGHT(name, CHARINDEX(' ', reverse(name)))
		,'*')
	
FROM(
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
        UNION ALL SELECT 'test test test test'
        UNION ALL SELECT '   '
	)A

так?
2 окт 09, 17:01    [7736435]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
declare @t table(s varchar(40))
insert into @t(s)
select 'Петька' union all
select 'Василий Иванович' union all
select 'Полиграф      Полиграфович Шариков' union all
select 'Иоанн   Васильевич Грозный (Бунша)' union all
select 'test test test' union all
select 'aaa a a' union all
select ''

select s
      ,case when ln - ln1 - ln2 > 0 and ln1 > 0
            then s1 + replicate('*', ln - ln1 - ln2) + s2
            else s
        end as result
  from (select s
              ,len(s + '1') - 1 as ln
              ,charindex(' ', s) as ln1
              ,charindex(' ', reverse(s)) as ln2
              ,left(s, charindex(' ', s)) as s1
              ,right(s, charindex(' ', reverse(s))) as s2
          from @t) as t
  
s                                        result
---------------------------------------- ----------------------------------------
Петька                                   Петька
Василий Иванович                         Василий Иванович
Полиграф      Полиграфович Шариков       Полиграф ***************** Шариков
Иоанн   Васильевич Грозный (Бунша)       Иоанн ******************** (Бунша)
test test test                           test **** test
aaa a a                                  aaa * a
                                         

(7 row(s) affected)
2 окт 09, 17:03    [7736447]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
Сергей Мишин
гость123,

SELECT
	name
	,IsNull(
		LEFT(name,CHARINDEX(' ', name))
		+replicate('*',len(name)-CHARINDEX(' ', reverse(name))-CHARINDEX(' ', name))
		+RIGHT(name, CHARINDEX(' ', reverse(name)))
		,'*')
	
FROM(
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
        UNION ALL SELECT 'test test test test'
        UNION ALL SELECT '   '
	)A

так?

для четырех и более пробелов подряд не отрабатывает, вместо двух звездочек меняет на одну и т.д. :(
2 окт 09, 17:09    [7736486]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
блин, множество пробелов упустил
declare @t table(s varchar(40))
insert into @t(s)
select 'Петька' union all
select 'Василий Иванович' union all
select 'Полиграф      Полиграфович Шариков' union all
select 'Иоанн   Васильевич Грозный (Бунша)' union all
select 'test test test' union all
select 'aaa a a' union all
select '' union all
select '      '

select s
      ,case when (ln - ln1 - ln2 > 0 or s not like '%[^ ]%') and ln1 > 0
            then s1 + replicate('*', ln - ln1 - ln2) + s2
            else s
        end as result
  from (select s
              ,len(s + '1') - 1 as ln
              ,charindex(' ', s) as ln1
              ,charindex(' ', reverse(s)) as ln2
              ,left(s, charindex(' ', s)) as s1
              ,right(s, charindex(' ', reverse(s))) as s2
          from @t) as t

s                                        result
---------------------------------------- ------------------------------------
Петька                                   Петька
Василий Иванович                         Василий Иванович
Полиграф      Полиграфович Шариков       Полиграф ***************** Шариков
Иоанн   Васильевич Грозный (Бунша)       Иоанн ******************** (Бунша)
test test test                           test **** test
aaa a a                                  aaa * a
                                         
                                          **** 

(8 row(s) affected)
2 окт 09, 17:13    [7736506]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
гость123

для четырех и более пробелов подряд не отрабатывает, вместо двух звездочек меняет на одну и т.д. :(

Пример приведите что на входе, что на выходе
2 окт 09, 17:16    [7736521]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Сергей Мишин
гость123

для четырех и более пробелов подряд не отрабатывает, вместо двух звездочек меняет на одну и т.д. :(

Пример приведите что на входе, что на выходе

Паганель уже в хопре...
2 окт 09, 17:18    [7736528]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
Сергей Мишин
На входе:
	SELECT 'test test test' name
	UNION ALL SELECT 'aaa a a'
        UNION ALL SELECT 'test test test test'
        UNION ALL SELECT '   '
        UNION ALL SELECT '    '
        UNION ALL SELECT '     '

На выходе:
test **** test
aaa * a
test ********* test
*
**
***



Паганель спасибо!

Еще вопрос, как определить что в строке более 2-х пробелов?
Я делаю вот так:
WHERE LEN(REPLACE(name, ' ',''))+1<LEN(name)
Но если в строке одни пробелы то это условие не отрабатывает и выкидывает из результатирующей выборки!
Заранее спасибо!
2 окт 09, 17:30    [7736590]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Дедушка
Паганель уже в хопре...

понял-)

гость123, в моём примере надо Len заменить на DATALENGTH
2 окт 09, 17:31    [7736600]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
гость123
Но если в строке одни пробелы то это условие не отрабатывает и выкидывает из результатирующей выборки!
Потому что функция len не учитывает завершающие пробелы
Один из способов борьбы с этим я уже показал
Другой - datalength (не забывая о том, сколько байтов в символе)
2 окт 09, 17:35    [7736619]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по строковым функциям с заменой  [new]
гость123
Guest
Всем спасибо за помощь!
теперь все понятно!
2 окт 09, 17:41    [7736643]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить