2012-10-24 66 views
6

Tôi cần phải thay thế một danh sách các ký tự trong chuỗi bằng một số ký tự được ánh xạ.Thay thế các ký tự trong một chuỗi dựa trên các hàng trong một bảng sql

Tôi có bảng 'dbo.CharacterMappings' với 2 cột: 'CharacterToFilter' và 'ReplacementCharacter'.

nói rằng có 3 bản ghi trong bảng này:

Filter Replacement  
$  s 
@  a 
0  o 

Làm thế nào tôi sẽ thay thế tất cả các ký tự trong một chuỗi lọc dựa trên các ánh xạ?

tức là 'Hell0 c @ t $' cần phải trở thành 'Xin chào mèo'.

Tôi thực sự không thể nghĩ ra bất kỳ cách nào để thực hiện việc này mà không phải dùng đến biến bảng và sau đó lặp qua nó. I E. có một biến bảng với cột 'đếm', sau đó sử dụng vòng lặp để chọn 1 hàng tại một thời điểm dựa trên cột này. Sau đó, tôi có thể sử dụng hàm REPLACE để cập nhật từng ký tự một.

Chỉnh sửa: Tôi nên lưu ý rằng tôi luôn muốn loại bỏ các ký tự này (tôi không cần phải lo lắng về $ 5 -> s5 chẳng hạn).

Trả lời

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

Wow, cảm ơn. Tôi không biết/chưa bao giờ thấy REPLACE được sử dụng như thế! – RobH

+0

Điều đó sẽ chỉ hoạt động trong một hàm hoặc thủ tục được lưu trữ, nhưng nó vẫn khá trơn. – LittleBobbyTables

+0

@LittleBobbyTables với một vài dấu chấm phẩy, tôi nghĩ bạn có thể sử dụng nó từ bất kỳ đâu? – podiluska

6

Bạn có thể tạo một hàm:

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 

Sau đó này

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

lợi nhuận Hello cats

+0

Mã này sẽ là một phần của hàm, nhưng cảm ơn bạn đã chỉ ra nó. – RobH

+1

Cảm ơn Tim, điều này đã giúp tôi xây dựng một tìm kiếm văn bản lớn thay thế. Tiết kiệm thời gian của tôi quá. – Ravia

Các vấn đề liên quan