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

Откуда: Київ
Сообщений: 10428
есть nvarchar(128) поле, в нем данные, надо получить в другом поле эту строку, убрав всё, что не альфанумерик...

как бы такое сделать?
6 июл 11, 22:03    [10935391]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
_djХомяГ
Guest
DECLARE @T TABLE(col1 varchar(300))
insert @t
select ' раз (8452) 40-12-111 ' union all
select 'два761)401-2999'



select t.*,(select case when substring(col1,number+1,1) like '[0-9]' then substring(col1,number+1,1) else '' end
	 from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	for xml path(''))
from @t t

6 июл 11, 22:08    [10935416]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
спасибо, но
надо оставлять буквы, т.е. альфанумерик должен быть допустим

раз (8452) 40-12-111 -> раз84524012111
два761)401-2999 -> два7614012999
6 июл 11, 22:40    [10935505]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Winnipuh,

...or substring(col1,number+1,1) like '[а-я]'
Ну можно так, хотя можно и по-другому))).
6 июл 11, 22:51    [10935528]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
kDnZP
Winnipuh,

...or substring(col1,number+1,1) like '[а-я]'
Ну можно так, хотя можно и по-другому))).


можно, конечно, но хотелось бы красиво, т.е. чтобы и русские и нерусские буквы учитывались как допустимые...

Ибо как писал Достоевский красота спасет мир
6 июл 11, 22:57    [10935545]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Winnipuh, ну дык + еще
 or substring(col1,number+1,1) like '[a-z]'
6 июл 11, 23:01    [10935553]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Winnipuh, или:
DECLARE @T TABLE(col1 varchar(300))
insert @t
select ' раз (8452) 40-12-111 ' union all
select 'два761)401-2999'



select t.*,(select case when CHARINDEX(substring(col1,number+1,1),'1234567890qwertyuiopasdfghjklzxcvbnmёйцукенгшщзхъфывапролджэячсмитьбю',1)>0 then substring(col1,number+1,1) else '' end
	 from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	for xml path(''))
from @t t
Если нужны еще какие-то символы, допишите))).
6 июл 11, 23:06    [10935563]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
kDnZP
Winnipuh, или:
DECLARE @T TABLE(col1 varchar(300))
insert @t
select ' раз (8452) 40-12-111 ' union all
select 'два761)401-2999'



select t.*,(select case when CHARINDEX(substring(col1,number+1,1),'1234567890qwertyuiopasdfghjklzxcvbnmёйцукенгшщзхъфывапролджэячсмитьбю',1)>0 then substring(col1,number+1,1) else '' end
	 from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	for xml path(''))
from @t t
Если нужны еще какие-то символы, допишите))).


о, спасибо, это жесть! на все случаи, кроме китайских, еврейских, арабских, корейских и т.д..
6 июл 11, 23:13    [10935576]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
kDnZP
Если нужны еще какие-то символы, допишите))).


что бы не дописывать символы :-)



DECLARE @T TABLE(col1 varchar(300))
insert @t
select ' раз (8452) 40-12-111 ' union all
select 'двДLа761)401-2999'



select t.*,

	(select substring(col1,number+1,1)
	from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	and (ascii(UPPER(substring(col1,number+1,1)))<>ascii(LOWER(substring(col1,number+1,1)))
	or ascii(UPPER(substring(col1,number+1,1))) between  48 and 57
	)
	for xml path('')
	
		 
	)

from @t t

6 июл 11, 23:45    [10935642]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
iap
Member

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

может, проще перечислить все недопустимые символы?
Тогда можно оставить все прочие, хоть китайские иероглифы, хоть древнеегипетские
7 июл 11, 09:17    [10936303]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Andrey Sribnyak
kDnZP
Если нужны еще какие-то символы, допишите))).


что бы не дописывать символы :-)



DECLARE @T TABLE(col1 varchar(300))
insert @t
select ' раз (8452) 40-12-111 ' union all
select 'двДLа761)401-2999'



select t.*,

	(select substring(col1,number+1,1)
	from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	and (ascii(UPPER(substring(col1,number+1,1)))<>ascii(LOWER(substring(col1,number+1,1)))
	or ascii(UPPER(substring(col1,number+1,1))) between  48 and 57
	)
	for xml path('')
	
		 
	)

from @t t



у меня nvarchar везде, проверил - увы не работает....
7 июл 11, 10:58    [10937027]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Winnipuh,

А что там может не работать?
проверил и с nvarchar работает :-\

DECLARE @T TABLE(col1 [color=yellow]n[/color]varchar(300))
insert @t
select ' раз (8452) 40-12-111dFe ' union all
select 'двДLа761)401-2999'



select t.*,

	(select substring(col1,number+1,1)
	from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	and (ascii(UPPER(substring(col1,number+1,1)))<>ascii(LOWER(substring(col1,number+1,1)))
	or ascii(UPPER(substring(col1,number+1,1))) between  48 and 57
	)
	for xml path('')
	
		 
	)

from @t t
7 июл 11, 11:09    [10937109]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Andrey Sribnyak,

Хитро здесь выделения цветом работают...
DECLARE @T TABLE(col1 nvarchar(300))

ТАк проверил...
7 июл 11, 11:14    [10937161]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
2 Andrey Sribnyak

да, я ошибся, все рабоатет!
спасибо
7 июл 11, 11:23    [10937259]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Как же можно писать ASCII() для юникода?
Есть же специальная функция UNICODE()
7 июл 11, 11:32    [10937351]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Andrey Sribnyak
Andrey Sribnyak,

Хитро здесь выделения цветом работают...
DECLARE @T TABLE(col1 nvarchar(300))

ТАк проверил...


кстати, пропускает символ № как альфанумерик

DECLARE @T TABLE(col1 nvarchar(300))
insert @t
select N' раз (8452) # $ @ 40-12-111 ' union all
select N'два761)№ 401-2999'

select t.*,(select 
case when (substring(col1,number+1,1) like '[0-9]' OR substring(col1,number+1,1) like '[a-z]'
OR substring(col1,number+1,1) like '[A-Z]'
OR substring(col1,number+1,1) like '[а-я]'
OR substring(col1,number+1,1) like '[А-Я]') 
then substring(col1,number+1,1) else '' end
	 from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	for xml path(''))
from @t t
7 июл 11, 11:38    [10937412]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строки  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
iap
Как же можно писать ASCII() для юникода?
Есть же специальная функция UNICODE()


За это нужно сжигать на костре? :-)

Можно и с юникоде

DECLARE @T TABLE(col1 nvarchar(300))
insert @t
select ' раз (8452) 40-12-111dFe ' union all
select 'двДLа761)401-2999№Å1234567890№><'



select t.*,

	(select substring(col1,number+1,1)
	from 
				
	master..spt_values val 
	where len(col1)>number and type='P'
	and (UNICODE(UPPER(substring(col1,number+1,1)))<>UNICODE(LOWER(substring(col1,number+1,1)))
	or UNICODE((substring(col1,number+1,1))) between  48 and 57
	or UNICODE((substring(col1,number+1,1)))=8470
	)
	for xml path('')
	
		 
	)

from @t t
7 июл 11, 11:58    [10937603]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить