2016-05-31 2 views
1

원본 테이블과 대체 할 문자가 두 개인 번역 테이블이 있습니다. A 열에는 B 열 또는 B 열이 없습니다. 문자열이 주어진다면, 변환 테이블의 각 행을 반복하여 A 열의 입력 문자열의 각 문자를 B 열의 문자로 바꾸고 완전히 변환 된 결과를 반환하고 싶습니다. while 루프를 사용하여이 작업을 수행하는 방법을 알고 있지만 가능한 경우 천천히 사용할 수 있으므로 사용하지 않는 것이 좋습니다.while 루프를 사용하지 않고 변환 테이블을 사용하여 SQL에서 문자열을 변경하십시오.

UPDATE :

변환 테이블 예 :

ColA | ColB 

%  | P 
$  | D 

입력 문자열 : % EN $ ANT

예상 출력 : 펜던트

+3

단어로 표 구조를 설명하지 말고 표 구조, 샘플 데이터 및 원하는 결과를 표시하십시오. – Siyual

+4

사용중인 dbms에 태그를 지정하십시오. 테이블 정의 (들), 샘플 테이블 데이터 및 예상 결과를 추가하십시오. – jarlh

+0

jarlh의 코멘트를 확장하려면 데이터베이스 질문에 적절한 소프트웨어 (MySQL, Oracle, DB2 등)와 버전을 태그하는 것이 유용합니다. 'sql-server-2014'. 구문과 기능의 차이가 종종 답변에 영향을 미칩니다. – HABO

답변

0

당신이이 문제를 해결하기 위해 데이터베이스를 사용하려는 경우 일종의 문제는 당신을 위해 당신을 위해 그것을 할 수있는 함수를 정의하거나 이렇게 할 수 있습니다 :

DECLARE @t TABLE (_from CHAR(1), _to CHAR(1), _order int); 

INSERT INTO @t 
     (_from, _to, _order) 
VALUES 
('%','P',1), 
('$','D',2) 


DECLARE @inp VARCHAR(20) = '%EN$ANT'; 

WITH cte AS (

    SELECT REPLACE(@inp,_from,_to) replacement, _order FROM @t WHERE _order = 1 
    UNION ALL 

    SELECT REPLACE(replacement, _from,_to) , [@t]._order FROM cte 
    JOIN @t ON [@t]._order = cte._order+1 
) 
SELECT TOP 1 replacement 
FROM cte replacement 
ORDER BY _order desc 

결과 :

replacement 
PENDANT 

_order은하지 않는 것이 중요합니다, 그냥 거기에 우리가 한 번에 하나 개의 교체를 할 수 있는지 확인하는 것입니다.

관련 문제