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

Откуда:
Сообщений: 296
Всем привет!
Нужно убрать все символы кроме цифр в поле и вывести результат новым полем.

Типа того:
select *, WHILE Field1 LIKE '%[^0-9]%' SET Field1=STUFF(Field1,PATINDEX('%[^0-9]%',Field1),1,'') as NewField
from dp_TestReplace
1 ноя 17, 11:59    [20918449]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5619
Вложенные replace (всего-то 10 штук) будут самым быстрым вариантом. Если такую операцию нужно делать в нескольких местах - оформите её в виде инлайновой UDF.
1 ноя 17, 12:11    [20918498]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
st90
Member

Откуда:
Сообщений: 296
Сон Веры Павловны,
почему всего 10?
1 ноя 17, 12:21    [20918535]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
aleks222
Guest
st90
Сон Веры Павловны,
почему всего 10?

Присоединяюсь к вопросу.

ЗЫ. Вариантов два
1. CTE
2. Разборка строки на символы и сборка взад только нужных.
1 ноя 17, 12:24    [20918545]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
выборка чисел из строки
1 ноя 17, 12:32    [20918566]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
st90
почему всего 10?
Можно обойтись всего 10-ю
declare @s varchar(100) = '&hgt1mm5mm0---89-k';

select (
 select
  t.n.value('@v', 'char(1)')
 from
  (select cast(cast('' as xml).query('sql:variable("@s")') as varchar(max))) a(s) cross apply
  (select replace(a.s, '0', '<d v = "0" />')) d0(s) cross apply
  (select replace(d0.s, '1', '<d v = "1" />')) d1(s) cross apply
  (select replace(d1.s, '2', '<d v = "2" />')) d2(s) cross apply
  (select replace(d2.s, '3', '<d v = "3" />')) d3(s) cross apply
  (select replace(d3.s, '4', '<d v = "4" />')) d4(s) cross apply
  (select replace(d4.s, '5', '<d v = "5" />')) d5(s) cross apply
  (select replace(d5.s, '6', '<d v = "6" />')) d6(s) cross apply
  (select replace(d6.s, '7', '<d v = "7" />')) d7(s) cross apply
  (select replace(d7.s, '8', '<d v = "8" />')) d8(s) cross apply
  (select replace(d8.s, '9', '<d v = "9" />')) d9(s) cross apply
  (select cast('<s>' + d9.s + '</s>' as xml)) b(x) cross apply
  b.x.nodes('/s/d') t(n)
for xml path(''), type).value('.', 'varchar(100)');
1 ноя 17, 13:03    [20918698]     Ответить | Цитировать Сообщить модератору
 Re: Как зациклить STUFF в SELECTе  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5619
aleks222
st90
Сон Веры Павловны,
почему всего 10?

Присоединяюсь к вопросу.

ЗЫ. Вариантов два
1. CTE
2. Разборка строки на символы и сборка взад только нужных.

А, тьфу, впопыхах прочитал, что убрать только цифры.
Есть еще и третий вариант - CLR-функция, убирающая символы регуляркой.
1 ноя 17, 14:25    [20919004]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить