2012-10-24 17 views
6

Muszę zastąpić listę znaków w ciągu z niektórymi zmapowanymi znakami.Zastępowanie znaków w ciągu znaków na podstawie wierszy w tabeli sql

Mam tabelę "dbo.CharacterMappings" z 2 kolumnami: "CharacterToFilter" i "ReplacementCharacter".

powiedzieć, że istnieją 3 rekordy w tabeli:

Filter Replacement  
$  s 
@  a 
0  o 

Jak bym zastąpić wszystkie znaki w łańcuchu filtrów opartych na tych odwzorowań?

tj. "Hell0 c @ t $" musi stać się "Hello cats".

Nie mogę naprawdę wymyślić żadnego sposobu na zrobienie tego bez odwoływania się do zmiennej tabeli, a następnie przechodzenia przez nią. To znaczy. mieć zmienną tabeli z kolumną "count", a następnie użyć pętli, aby wybrać 1 wiersz na raz na podstawie tej kolumny. Następnie mogę użyć funkcji REPLACE, aby zaktualizować znaki po jednym na raz.

Edycja: Powinienem zauważyć, że zawsze chcę rozebrać te postacie (nie muszę się martwić na przykład 5 $ -> s5).

Odpowiedz

11
declare @s varchar(50)= 'Hell0 [email protected]$' 
select @s = REPLACE(@s, CharacterToFilter, ReplacementCharacter) 
    from CharacterMappings 
select @s 
+0

Wow, dzięki. Nie wiedziałem/nigdy nie widziałem REPLACE używanego w ten sposób! – RobH

+0

To działałoby tylko w funkcji lub w procedurze przechowywanej, ale nadal jest całkiem śliskie. – LittleBobbyTables

+0

@LittleBobbyTables z kilkoma średnikami, myślę, że możesz go użyć z dowolnego miejsca? – podiluska

6

Można utworzyć funkcję:

CREATE FUNCTION [dbo].[ReplaceAll] 
(
    @text varchar(8000) 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    SELECT @text = 
     REPLACE(@text,cm.Filter, cm.Replacement) 
    FROM CharacterMappings cm; 
    RETURN @text 
END 

Wtedy to

select dbo.[ReplaceAll]('Hell0 [email protected]$'); 

powraca Hello cats

+0

Kod będzie częścią funkcji mimo to, ale dzięki za wskazanie go. – RobH

+1

Dzięki Tim, pomógł mi zbudować duże wyszukiwanie tekstu zastąpić. Zaoszczędziłem też mój czas. – Ravia

Powiązane problemy