我正在尝试创建一个查询,在其中我找到两个不同列的子字符串上的匹配项。我可以使用“ with”表获取结果,然后查询这些结果,但是速度很慢。
第2行是搜索条件将要查找的内容。简化Row2
columnC = 1
第2列columnB保留要从中取出子字符串以检查的值
查看Row1 columnA subtring = Row2 columnB子字符串。
任何建议或想法表示赞赏。
答案 0 :(得分:1)
也许您可以为此目的使用LAG()(请参阅documentation)。示例:
表格和数据
create table t1 ( column_a, column_b )
as
select 'string100', 'string200' from dual union
select 'string200', 'string100' from dual union
select 'string300', 'string100' from dual union
select 'string400', 'string500' from dual union
select 'string500', 'string400' from dual ;
使用LAG()查找“前”值
select
column_a
, column_b
, lag ( column_a, 1, 0 ) over ( order by column_a ) preceding_a
from t1 ;
COLUMN_A COLUMN_B PRECEDING_A
string100 string200 0
string200 string100 string100
string300 string100 string200
string400 string500 string300
string500 string400 string400
最终查询和结果
-- Check: is Row1 columnA subtring = Row2 columnB substring
select column_a, column_b,
case
when substr( preceding_a, 7, 1 ) = substr( column_b, 7, 1 ) then
'substring Row1 columnA = substring Row2 columnB'
else
'substrings don''t match'
end compare_substrings
from (
select
column_a
, column_b
, lag ( column_a, 1, 0 ) over ( order by column_a ) preceding_a
from t1
) ;
COLUMN_A COLUMN_B COMPARE_SUBSTRINGS
string100 string200 substrings don't match
string200 string100 substring Row1 columnA = substring Row2 columnB
string300 string100 substrings don't match
string400 string500 substrings don't match
string500 string400 substring Row1 columnA = substring Row2 columnB
您可能可以使“最终查询”更加紧凑(即,无需编写内联视图)。 Dbfiddle here。