Замена строки по шаблонам в таблице
bambaruk
Дата: 16.02.2010 09:18:07
Здравствуйте!
Есть таблица (а), из которой формирую вьюшку. Из одного из полей я бы хотел удалять подстроки по образцам из другой таблицы (б).
Например, в таблице б содержатся:
001
003
005
Во вьюшке из таблицы а вместо "001 Название отдела" я хочу получить просто "Название отдела", то есть удалить подстроку 001 так как она есть в таблице б.
Иными словами, написать что-то типа select replace(field, select pattern from b, '') from a.
MS SQL 2008.
bambaruk
Дата: 16.02.2010 09:23:45
Вот эта логика реализована клиентским скриптом, хотелось бы тоже самое сделать средствами sql, строки для удаления в отдельной таблице
if ($a -like "КЯ-*") {$a = $a.Replace("КЯ-","")}
if ($a -like "ВЛЖСМ1 - *") {$a = $a.Replace("ВЛЖСМ1 - ","")}
if ($a -like "В2СМ - *") {$a = $a.Replace("В2СМ - ","")}
if ($a -like "12-*") {$a = $a.Replace("12-","")}
if ($a -like "5-*") {$a = $a.Replace("5-","")}
if ($a -like "КЯСМ 1 - *") {$a = $a.Replace("КЯСМ 1 - ","")}
if ($a -like "7-*") {$a = $a.Replace("7-","")}
if ($a -like "8-*") {$a = $a.Replace("8-","")}
iap
Дата: 16.02.2010 09:32:02
Рекурсия. CTE.
А если после замены одной подстроки в строке "разрушится" другая подстрока,
которую тоже можно было бы заменить, если бы она попалась раньще?
Я хочу сказать, что порядок замен тоже может иметь значение.
bambaruk
Дата: 16.02.2010 09:37:26
iap:
>>> А если после замены одной подстроки в строке "разрушится" другая подстрока,
Подстрока для замены всегда идет с начала строки и всегда одна. Если начало строки совпадет с одним из шаблонов, то она больше не совпадет с другими. Это бухгалтерский код отдела, который нужно удалять.
Спасибо за намек, ищу в гугле.
iap
Дата: 16.02.2010 09:45:46
HandKot
Дата: 16.02.2010 09:48:23
declare @a table (otdel varchar(100))
declare @b table (pattern varchar(10))
insert into @a
select '001 Название отдела1' union all
select '002 Название отдела2' union all
select 'Название3 отдела 003' union all
select '004 Название отдела4' union all
select '005 Название отдела5'
insert into @b
select '001' union all
select '002' union all
select '003'
select
replace(a.otdel, isnull(b.pattern, ''), '')
from
@a a
left join @b b on b.pattern = left(a.otdel, len(b.pattern))
хотя с другой стороны, учитывая пример, где все что надо заменить заканяивается символом -(тире), просто по нему отсекать (left + charindex)?
I Have Nine Lives You Have One Only
THINK!
iap
Дата: 16.02.2010 09:59:08
bambaruk |
Подстрока для замены всегда идет с начала строки и всегда одна. Если начало строки совпадет с одним из шаблонов, то она больше не совпадет с другими. |
Если Вы это гарантируете, то можно, конечно, и без рекурсии
UPDATE T
SET Field=STUFF(Field,1, LEN(Pattern.S))
FROM Pattern
WHERE T.Field LIKE Pattern.S+'%';
Или просто SELECT
SELECT STUFF(T.Field,1, ISNULL(LEN(Pattern.S),0)) Field
FROM T LEFT JOIN Pattern ON T.Field LIKE Pattern.S+'%'
WHERE .....;
HandKot
Дата: 16.02.2010 10:03:50
bambaruk
учтите, что если у Вас будут следующие патерны для замены "00" и "001",
то будут косяки (из "001 Название отдела" вместо "Название отдела" получим "1 Название отдела")
но можно обойти используя MIN и GROUP BY
I Have Nine Lives You Have One Only
THINK!
bambaruk
Дата: 16.02.2010 12:10:04
Cпасибо большое, все получилось!