如何在Oracle SQL中查找最特定的匹配行

问题描述

我需要能够运行一个查询,该查询使我只能找到最具体的匹配项。我的意思是我有一个包含主题,类别和类型列的表,并且我想编写一个查询,该查询将仅选择与所有这三列都匹配的行。如果没有匹配所有3列的行,它将选择与主题和类别匹配的行。如果没有类别,它将选择与主题匹配的行。

我认为我使用函数LEAST看到了一些类似的东西:

SELECT LEAST(
    (SELECT * FROM TABLE_1 WHERE AMT < 10),(SELECT * FROM TABLE_1 WHERE AMT > 10)
)

所以我只是想知道是否可以通过类似的方法找到最具体的匹配项,或者是否需要其他方法

在此先感谢您的帮助。

解决方法

如果只需要一行,则可以在限制较少的条件下过滤表,然后使用case表达式对结果进行排序,最后只保留第一行。

select t.*
from mytable t
where subject = :subject
order by case
    when category = :category and type = :type then 0
    when category = :category then 1
    else 2
end fetch first 1 row only

如果满足条件之一的行可能不止一个,则可以改用fetch first 1 row with ties