Sql Oracle-从字符串_2中删除存在于字符串_1中的字母
我有一点小麻烦,非常感谢您的帮助;我想比较字符串_1和字符串_2中的字母,如果找到匹配项,则匹配的字母将从字符串_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
'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我刚刚更正了我的函数,请再试一次。太好了!谢谢,托尼:)