即使答案已经被接受,这也是我的替代解决方案。就性能而言,它很可能更差(待测试),但我认为值得展示,原因如下:
如您所见,有 5 列已经很容易漏掉一些案例,只有 31 个案例需要检查。如果您添加一列,则为 63 次检查,下一列为 127 次...您不必在这里担心,因为它会动态生成所有案例
另一个有趣的地方是,如果您有兴趣查看每一行的详细信息以及它匹配的原因,它会随查询免费提供。你只需要选择子视图
最后一点是,我认为这在学术上很有趣。该解决方案包含 UNPIVOTing 数据、递归自连接、动态表达式评估。当然,我不客观,但这样做很有趣:)
--Table and data to test the query
create table my_table ( column0 number, column1 number, column2 number,
column3 number, column4 number, column5 number );
INSERT INTO my_table values (100,20,20,10,40,10); -- must match on the sum of 5 columns
INSERT INTO my_table values (100,50,200,300,150,250); -- must not match
INSERT INTO my_table values (100,50,50,100,150,250); -- must match twice ( on col1+col2 and col3 )
-- If your table has a unique key, you can remove the datas_with_id and put
-- your table directly in the unpivoted_data subquery
with datas_with_id as ( select rowid as row_id, t.* from my_table t),
unpivoted_data as ( select row_id, column0 as sum_to_check, column_name, column_value
from datas_with_id
unpivot ( column_value for column_name in (column1,column2,column3,column4,column5))),
calculated_sum as ( select row_id, xmlquery(sys_connect_by_path(u.column_value,'+')||' = '|| sum_to_check
returning content).getStringVal() result
from unpivoted_data u connect by nocycle prior column_name>column_name
and prior row_id=row_id and level < 6)
select * from my_table where rowid in ( select row_id from calculated_sum where result = 'true' )
如果要添加另一列,在unpivot子句中添加,级别加1即可
如果你添加 sys_connect_by_path(u.column_name,'+')||' ='||在calculated_sum中sum_to_check,你可以看到每一个匹配的公式