2013-03-06 4 views
2

У меня есть table A, который содержит текстовый столбец. В моем сохраненном proc у меня есть временная таблица, содержащая два значения столбца и новое значение, имеющее количество строк. Мне нужно заменить все вхождения старых значений новыми значениями, указанными в таблице temp, в текстовом столбце в моем table A.SQL: Заменить текстовое значение в столбце, используя старые значения из другой таблицы

Текстовое поле в таблице A не совпадает со значением oldvalue в таблице temp, поэтому я не могу использовать соединение. Значение текстового столбца может быть «там ничего нет». Там может быть строка в таблице temp со значением oldvalue = 'there' и newvalue = 'here'. Наконец, значение столбца должно быть заменено на «здесь ничего здесь». Это должно применяться ко всем строкам столбца в table A.

Один из вариантов - перебирать временную таблицу (не предпочтительнее). Есть ли лучший/элегантный/оптимизированный способ сделать это?

+0

Примеры данных могут помочь. Вы имеете в виду, что таблица temp содержит, например, «(старый, новый) (собака, волк), (коричневый, черный)», и вы хотите обновить строку «быстрая коричневая лиса перепрыгнула через ленивую собаку» в «быстрый черный волк перепрыгнул через ленивую собаку "? –

+0

@MartinSmith - Точно. – ubaid

+0

Возможный дубликат [Заменить часть строки с капитализированным эквивалентом из таблицы перекрестных ссылок - tsql] (http://stackoverflow.com/questions/13918473/replace-part-of-string-with-capitalised-equivalent-from-cross -ref-temp-table-t) –

ответ

1

Это должно быть сделано.

;with r as (
    select 
    row_number() over(order by oldv) rn 
    ,oldv 
    ,newv 
    from #replacevalues 
) 
, 
res as (
    select 
    0 as ver 
    ,txt as oldcte 
    ,txt as newcte 
    from tablea 
    union all 
    select 
    ver+1 
    ,oldcte 
    ,replace(newcte,oldv,newv) 
    from res 
    join r 
    on r.rn=ver+1 
) 
update t 
    set txt = res.newcte 
from tablea t 
join res on t.txt = res.oldcte 
where res.ver = (select max(ver) from res) 
+0

Текстовое поле в таблице A не совпадает со значением oldvalue в таблице temp, поэтому я не могу использовать соединение. Значение текстового столбца может быть «там ничего нет». Там может быть строка в таблице temp со значением oldvalue = 'there' и newvalue = 'here'. Теперь выход должен быть «здесь ничего нет». Это должно применяться ко всем строкам столбца в таблице A. Надеюсь, что я имею в виду. :) – ubaid

+0

Попробуйте показать некоторые примеры данных .. потому что я не понимаю. Это положит новое значение, где оно будет соответствовать старому значению в таблице a –

+0

Отредактировал мой комментарий с примера. – ubaid

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