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

Откуда:
Сообщений: 198
В Sql Server 2005 есть таблица в которой столбец с телефонами. Все телефоны занесены кое как - то етсь встречаются скобки, тире, буквы...то есть в общем виде телефон может быть заведен так - м8(903)333-33-33 ....В самой табоице данные корректировать нельзя но надо вывести все эти телефоны без дополнительных символов - то есть только цифры. Кто нибудь подскажет как проще сделать? У меня пока в голову пришла только идея сделать курсор и потом по каждому номеру телефону сравнивать каждый символ с цифрами от 0 до 9 , удалять все что не совпадает с цифрами и потом это либо во вьюху запихивать либо во временную таблицу...Может есть способ проще? Или может мой сопсоб изначально не верен?
4 июн 09, 13:23    [7264971]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
CREATE FUNCTION [dbo].[fn_Translate]
(
  @sourceString varchar(8000),
  @searchMap varchar(8000),
  @replacementMap varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @cPos int, @maxCPos int

SET @maxCPos = DataLength(@searchMap)
SET @cPos = 1

WHILE @cPos <= @maxCPos
BEGIN
	SET @sourceString = Replace(@sourceString, SubString(@searchMap, @cPos, 1), SubString(@replacementMap, @cPos, 1))
	SET @cPos = @cPos + 1
END

RETURN @sourceString

END
GO


Declare @Number varchar(50)
Declare @invalidcharacters varchar(100)

set @invalidcharacters = ' №N!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'

select dbo.fn_Translate('+7(910)-123-4578', @invalidcharacters, '') as Phone
4 июн 09, 13:28    [7265017]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
with
a as(
	select 1 id, 'м8(903)3' p
	union all select 2, 'м812(90x3)'
	union all select 3, '812'
)
,b as(
select id, cast(p as varchar) p, 0 i from a
union all
select 
	id
	,cast(case when substring(p,i+1,1) not like '[0-9]' then stuff(p,i+1,1,'#') else p end as varchar)
	,i+1
	from b where len(p)>i
)


select top 1 with ties
	replace(p,'#','')
from b
order by
	row_number() over(partition by id order by i desc)

4 июн 09, 13:43    [7265109]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
vovaa
Member

Откуда:
Сообщений: 198
Konst_One,спасибо большое...
4 июн 09, 13:57    [7265171]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SQL2005/2008
USE tempdb;
SET NOCOUNT ON;

CREATE TABLE T(Phone VARCHAR(100));
INSERT T(Phone) VALUES('м8(903)333-33-33 '),('+7 894-99-00');


WITH Phones(N, Phone) AS (SELECT ROW_NUMBER()OVER(ORDER BY (SELECT NULL)), Phone FROM T)
,Symbols(N,Symbol) AS
(
 SELECT P.N, SUBSTRING(P.Phone,V.number+1,1)
 FROM Phones P JOIN master.dbo.spt_values V ON V.type='P' AND V.number<LEN(P.Phone)
 WHERE SUBSTRING(P.Phone,V.number+1,1)LIKE'[0-9]'
)
SELECT (SELECT ''+SS.Symbol FROM Symbols SS WHERE SS.N=S.N ORDER BY SS.N FOR XML PATH('')) Phone
FROM Symbols S
GROUP BY S.N
ORDER BY S.N;
4 июн 09, 14:00    [7265188]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
vovaa
Member

Откуда:
Сообщений: 198
Konst_One,
Скажите а можно сделать так чтобы функция обрабатывала не одну строку а набор стро с разными телефонами? я попробовал через курсор перебирать весь список телефонов- в принципе все работает но каждая строка выдается как результат отдельного запроса.
4 июн 09, 15:55    [7265972]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
может вам не функция тогда нужна? посмотрите на другие решения, что вам тут подсказали.
еще можете попробовать с табличной функцией или пишите отдельную хранимку, где обрабатывайте как вам надо и возвращайте резалтсэт
4 июн 09, 16:01    [7266019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить