2015-08-04 5 views
1

У меня есть две таблицы, как показано ниже:SQL Server 2008 R2: Выберите оператор в REPLACE()

Table1: Test1

Create table Test1 
(
    name varchar(50) 
); 

Вставка:

insert into Test1 values('a$xyz'); 
insert into Test1 values('xyz$a'); 

Table2: Test2

create table Test2 
(
    pattern varchar(50) 
); 

Вставка:

insert into Test2 values('a$'); 
insert into Test2 values('$a'); 

Теперь я хочу update таблицу Test1. В частности, я хочу обновить имя в таблице, заменив шаблон таблицы Test2.

Как:

update Test2 
set name = replace(name,'a$',''); 

Как я могу получить string_to_replace из таблицы Test2? По моим сведениям, мы не можем использовать SELECT в функции REPLACE.

+0

W шляпа, ты точно меняешь? Как выглядит таблица 1 после обновления? –

+0

@ shree.pat18, я заменяю имя 'a $ xyz' на' xyz'.Но я хочу взять 'string_to_replace' из таблицы' Test2', в которой я получу 'a $' и хочу заменить пустой строкой '' ''. – MAK

+0

Итак, это должно произойти для каждого шаблона, который может соответствовать? Смысл, если Test2 имеет другую строку 'yz', которая также должна быть заменена? –

ответ

2

Этот скрипт будет обновлять каждую строку только один раз.

Создать эту функцию:

CREATE FUNCTION f_test 
(
    @a varchar(50) 
) 
returns varchar(50) 
AS 
BEGIN 
    SELECT @a = replace(@a, pattern, '') 
    FROM test2 
    RETURN @a 
END 

Зов это следующим образом:

UPDATE test1 
SET name = dbo.f_test(name) 

EDIT:

Вместо того, чтобы обновить все строки, это может быть более эффективным, поскольку он обновляет только соответствующий строки:

;WITH CTE as 
(
    SELECT name, dbo.f_test(name) namenew 
    FROM test1 
) 
UPDATE CTE 
SET name = namenew 
WHERE name <> namenew 
+0

Хорошо! Понял. Большое вам спасибо за это. – MAK

+1

@MAK это был интересный вызов, которого я раньше не видел. Надеюсь, вы получите больше бонусов –

+0

:) Увидим. Я тоже надеюсь на то же самое. – MAK

2
WHILE (1 = 1) 
    BEGIN 
     UPDATE Test1 
     SET Test1.NAME = Replace(Test1.NAME, Test2.pattern, '') 
     FROM Test1, 
      Test2 
     WHERE (Test1.NAME LIKE '%' + Test2.pattern + '%') 

     IF @@rowcount = 0 
     BREAK 
    END 

SELECT * 
FROM Test1 

SQL Fiddle

1

Я думаю, что это то, что вы ищете.

Update t1 
set t1.name = replace(name,t2.pattern,'') 
from Test1 t1 , Test2 t2 
where t1.name like '%'+t2.pattern+'%' 

select * from Test1 

проверка sqlfiddle: http://www.sqlfiddle.com/#!3/eda97/6

+0

Это будет работать только в том случае, если будет только 1 матч, если будет более 1 матча, он не обновит все совпадения –

1

Или, используя курсор, чтобы пройти через все Заменяет несколько раз:

DECLARE @pat varchar(8) 
DECLARE patc CURSOR FOR SELECT pattern FROM test2 
OPEN patc 
FETCH NEXT FROM patc INTO @pat 
WHILE @@FETCH_STATUS = 0 
BEGIN 
UPDATE test1 SET name=REPLACE(name,@pat,'') 
FETCH NEXT FROM patc INTO @pat 
END 

SELECT * FROM test1 

Может быть, немного "много" кода, но это работает, смотрите здесь : http://www.sqlfiddle.com/#!3/7289c/2

Предыдущие решения Deepanshu Kalra и Mukund действительно отлично подходят для вашего примера, так как по большей части один из шаблонов находится в каждом дело. Для более общего случая, когда несколько шаблонов могут быть найдены (и применены) к одному слову, подход cursor является более общим решением.

+0

Да! выглядит как больше кода. Но все-таки хорошее решение. Огромное спасибо. – MAK

Смежные вопросы