2017-09-07 3 views
-1

STRINGの問題が少しありました。ご協力いただきありがとうございます。 STRING_1の文字をSTRING_2と比較したい場合は、一致する文字がSTRING_2から削除されます。 (‘MICROSOFT’は一‘M’‘S’が含まれる)、例えばOracle - STRING_1にある文字をSTRING_1から削除します。

は、STRING_1は‘MICROSOFT’の値を含む、STRING_2は‘MSS’の値が含まれ、Iは、したがって結果のよう‘S’として表示することになります。 STRING_1の値が‘MISS’、STRING_2の値が‘MISS’の場合、結果はNULLと表示されます。

しかし、私が使用しているクエリでは、目的の結果が得られていません。 (STRING_1 = ‘MICROSOFT’STRING_2 = ‘MSS’)上記と同じ例を使用して、出力が‘MICROSOFT’から‘S’値が‘MSS’‘S’値の両方のインスタンスを削除して、NULLであり、私はそれのようのみ‘MSS’から‘S’値のいずれかを除去することになります。

以下は、使用しているクエリの例です。私はこの明確に十分に説明していませんでした場合

WITH 
TABLE_1 AS (SELECT 'ADVANCED' AS STRING_1, 
        'ANNA' AS STRING_2 
       FROM DUAL 
      UNION 
      SELECT 'MICROSOFT' AS STRING_1, 
        'MSS' AS STRING_2 
       FROM DUAL 
      UNION 
      SELECT 'MICROSOFT' AS STRING_1, 
        'MSOFT' AS STRING_2 
       FROM DUAL 
      UNION 
      SELECT 'MISS' AS STRING_1, 
        'MISS' AS STRING_2 
       FROM DUAL) 
SELECT T1.*, 
     REGEXP_REPLACE(TRANSLATE(T1.STRING_2,T1.STRING_1,RPAD(' ',LENGTH(T1.STRING_2))),'[[:space:]]','') AS RESULT 
    FROM TABLE_1 T1 

の実績

Actual Result

望ましい結果

Desired Result

謝罪 - あなたがいずれかを必要とするなら、私に知らせて自由に感じます詳しくは。

ご協力いただければ幸いです。

事前に感謝します。

+0

私はこれを処理するためにいくつかの動的SQLが必要になると思います。 –

+0

私はPL/SQL関数 'remove(string1、string2)'を作成すると言っていますが、「純粋なSQLで行う必要があります」と回答しています: –

+0

@TonyAndrewsはい、関連:https:// stackoverflow .com/questions/40502739/how-to-get-exact-character-diff-between-two-string-in-sql – Abra001

答えて

0

OK、PL/SQLソリューションあなたが言ったように、あなたはそれで幸せになる:

create or replace function remstr (s1 varchar2, s2 varchar2) return varchar2 
is 
    len integer := nvl(length(s2),0); 
    outstr varchar2(32767) := s1; 
    pos integer; 
begin 
    for i in 1..len loop 
    pos := instr(outstr, substr(s2,i,1)); 
    if pos > 0 then 
     outstr := substr(outstr,1,pos-1)||substr(outstr,pos+1); 
    end if; 
    end loop; 
    return outstr; 
end; 

次のように使用します。

WITH 
TABLE_1 AS 
(SELECT 'ADVANCED' AS STRING_1, 'ANNA' AS STRING_2 FROM DUAL 
UNION 
SELECT 'MICROSOFT' AS STRING_1, 'MSS' AS STRING_2 FROM DUAL 
UNION 
SELECT 'MICROSOFT' AS STRING_1, 'MSOFT' AS STRING_2 FROM DUAL 
UNION 
SELECT 'MISS' AS STRING_1, 'MISS' AS STRING_2 FROM DUAL 
) 
SELECT 
T1.*, REMSTR(STRING_2, STRING_1) AS RESULT 
FROM 
TABLE_1 T1 

私がテストし、あなたの希望する結果を得ました。

+0

これを行う時間をとってくれてありがとう、トニー - 非常に感謝します。私は私の最後をテストしましたが、最終結果は正しくありません。STRING_2から最初に一致する文字のみを削除しているように見えます(例えば、 'ANNA'は 'NNA'となります)。私は今日の午後の仕事で遊びますが、もう一度、ありがとうございます。 – MAndrews

+0

@MAndrews私は機能を修正しました。もう一度試してみてください。 –

+0

完了!ありがとう、トニー:) – MAndrews

関連する問題