我正在使用以下查询:
select AAA, BBB, CCC, DDD from (
select * from TABLE_A
where (AAA='a1' or AAA='*')
and (BBB='b1' or BBB='*')
and (CCC='c1' or CCC='*')
and (DDD='false')
order by decode(AAA, '*', 0, 4) + decode(BBB, '*', 0, 2) + decode(CCC, '*', 0, 1) desc
)where rownum <= 1
字符串
获取DDD=false的顶级记录(基于优先级,带通配符)。优先级只适用于我有一个完全匹配,通配符匹配它被忽略(AAA>BBB>CCC)。我想得到第二条记录,但是DDD=true,并将它们合并,这样我总共得到2条记录(最上面的一条DDD=false,最上面的一条DDD=true):
我试过只添加UNION ALL和查询的副本,同时更改DDD='true',但它看起来并不理想,因为它基本上复制了完整的查询,只有DDD='true'与第一个查询不同:
select AAA, BBB, CCC, DDD from (
select * from TABLE_A
where (AAA='a1' or AAA='*')
and (BBB='b1' or BBB='*')
and (CCC='c1' or CCC='*')
and (DDD='false')
order by decode(AAA, '*', 0, 4) + decode(BBB, '*', 0, 2) + decode(CCC, '*', 0, 1) desc
)where rownum <= 1
UNION ALL
select AAA, BBB, CCC, DDD from (
select * from TABLE_A
where (AAA='a1' or AAA='*')
and (BBB='b1' or BBB='*')
and (CCC='c1' or CCC='*')
and (DDD='true')
order by decode(AAA, '*', 0, 4) + decode(BBB, '*', 0, 2) + decode(CCC, '*', 0, 1) desc
)where rownum <= 1
型
有没有更聪明的方法来实现这一点?
2条答案
按热度按时间k97glaaz1#
在DDD上使用
RANK
、DENSE_RANK
或ROW_NUMBER
分区:字符串
如果您有任何具有相同秩的行,则可能返回2个以上的结果。如果在这种情况下只需要一个,请将
RANK()
更改为ROW_NUMBER()
h4cxqtbf2#
您可以使用
IN
来简化过滤条件,并确保您只获得DDD
的true
或false
值,然后使用ROW_NUMBER
解析函数来模拟多个分区的ROWNUM
伪列行为:字符串