Sql Oracle-从字符串_2中删除存在于字符串_1中的字母

Sql Oracle-从字符串_2中删除存在于字符串_1中的字母,sql,string,oracle,Sql,String,Oracle,我有一点小麻烦,非常感谢您的帮助;我想比较字符串_1和字符串_2中的字母,如果找到匹配项,则匹配的字母将从字符串_2中删除 例如,字符串1包含值'MICROSOFT',字符串2包含值'MSS',因此我希望结果显示为'S'(因为'MICROSOFT'只包含一个'M'和一个'S')。如果字符串_1包含值'MISS',而字符串_2包含值'MISS',则我希望结果显示为NULL 然而,我使用的查询并没有产生期望的结果;使用上面相同的示例(STRING\u 1='MICROSOFT',STRING\u 2

我有一点小麻烦,非常感谢您的帮助;我想比较字符串_1和字符串_2中的字母,如果找到匹配项,则匹配的字母将从字符串_2中删除

例如,字符串1包含值
'MICROSOFT'
,字符串2包含值
'MSS'
,因此我希望结果显示为
'S'
(因为
'MICROSOFT'
只包含一个
'M'
和一个
'S'
)。如果字符串_1包含值
'MISS'
,而字符串_2包含值
'MISS'
,则我希望结果显示为
NULL

然而,我使用的查询并没有产生期望的结果;使用上面相同的示例(
STRING\u 1='MICROSOFT'
STRING\u 2='MSS'
),输出为
NULL
,来自
'MICROSOFT'
'S'
值正在删除
'MSS'
中的
'S'
值的两个实例,我只希望它只从
'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
实际结果

期望结果

如果我解释得不够清楚,请道歉。如果您需要更多信息,请随时告诉我

任何帮助都将不胜感激


非常感谢。

好的,一个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 

我测试并得到了您想要的结果。

我想您需要一些动态SQL来处理这个问题。我会说创建一个PL/SQL函数
remove(string1,string2)
,但我知道响应将是“这必须在纯SQL中完成”:-@TonyAndrews是的,相关:感谢您的及时响应@TonyAndrews,纯SQL会更好,但如果不可能,我很乐意使用函数-只要我能达到预期的结果:)再次感谢。感谢你花时间做这件事,Tony-非常感谢。我已经测试了我的end,但最终结果并不完全正确-它似乎只是从字符串_2中删除了第一个匹配的字母(例如,“ANNA”变成了“NNA”,而不是“N”)。今天下午我将玩这个函数,不过还是谢谢你。@MAndrews我刚刚更正了我的函数,请再试一次。太好了!谢谢,托尼:)