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

Откуда:
Сообщений: 5
Добрый день,

возможно как - нибудь прописать что-то вроде

REPLACE(xxx, '[%a-x%]', '') - т.е хочу удалить все буквы, оставить цифры

Покопался пока ниче нашел
28 июн 15, 14:27    [17825236]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
Gviber
Member

Откуда:
Сообщений: 124
Простого решения у этой задачи нет.
28 июн 15, 15:12    [17825318]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
выборка чисел из строки

Немного исправлено:
SET NOCOUNT ON;
USE tempdb;

IF OBJECT_ID(N't1','U') IS NOT NULL DROP TABLE t1;
CREATE TABLE t1(nk INT,phone VARCHAR(100));
GO

INSERT t1(nk,phone) SELECT 1,'123А45-67В890' UNION ALL SELECT 2, '764576-+GGG9887';
GO

SELECT
 t1.nk
,(
  SELECT SUBSTRING(t.phone,v.number,1)
  FROM t1 t JOIN master.dbo.spt_values v
  ON v.type='P' AND v.number BETWEEN 1 AND LEN(t.phone) AND SUBSTRING(t.phone,v.number,1)LIKE'[0-9]'
  WHERE t.nk=t1.nk
  ORDER BY v.number
  FOR XML PATH(''), TYPE
 ).value('.','varchar(100)') phone
FROM t1;
Вместо master.spt.values используйте свою таблицу чисел.

P.S. Сейчас налетят фанаты CLR UDF


Посмотрите ещё это: Функция, которая делит строку на слова
28 июн 15, 16:52    [17825518]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
SeriosSan
Добрый день,

возможно как - нибудь прописать что-то вроде

REPLACE(xxx, '[%a-x%]', '') - т.е хочу удалить все буквы, оставить цифры

Покопался пока ниче нашел


17308762

select ext.Regex_Replace(phone, N'\D+', N'', null) from t1;
28 июн 15, 17:50    [17825614]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
SeriosSan,

скорее всего медленней чем предложенные варианты но тоже дает необходимый результат
declare @x varchar(255)
set @x = 'abc435tesdt78for90inser!=+24test'

while patindex('%[^0-9]%', @x) > 0
     set @x = stuff(@x, patindex('%[^0-9]%', @x), 1, '')

select @x
29 июн 15, 00:58    [17826547]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
SeriosSan
Member

Откуда:
Сообщений: 5
Привет, спасибо. Циклы, к сожалению, использовать не могу. Но сделал так же - во внутреннем Patindex, внешний stuff
29 июн 15, 09:26    [17826918]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SeriosSan
Но сделал так же - во внутреннем Patindex, внешний stuff
И где же можно посмотреть?
29 июн 15, 09:41    [17826964]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
SeriosSan
Привет, спасибо. Циклы, к сожалению, использовать не могу. Но сделал так же - во внутреннем Patindex, внешний stuff


это как? O_o

+ неудержался
iap предложил xml, churupaha как всегда regex, ждем a_voronina с предложением использовать SSIS
29 июн 15, 13:35    [17828062]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
felix_ff
это как? O_o

Рекурсивный CTE?
declare @x varchar(255)
set @x = 'abc435tesdt78for90inser!=+24test'
;with cte as (
  select stuff(@x, patindex('%[^0-9]%', @x), 1, '') s
  union all
  select stuff(s, patindex('%[^0-9]%', s), 1, '')
  from cte
  where patindex('%[^0-9]%', s)>0
)
select * from cte where patindex('%[^0-9]%', s)=0

неоптимально, конечно, но как вариант.
29 июн 15, 14:16    [17828308]     Ответить | Цитировать Сообщить модератору
 Re: Удалить буквы, оставить цифры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
точнее, вот так:
declare @x varchar(255)
set @x = 'abc435tesdt78for90inser!=+24test1'
;with cte as (
  select convert(varchar(100), @x) s
  union all
  select convert(varchar(100),stuff(s, patindex('%[^0-9]%', s), 1, ''))
  from cte
  where patindex('%[^0-9]%', s)>0
)
select * from cte where patindex('%[^0-9]%', s)=0
29 июн 15, 14:25    [17828346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить