如何在 Oracle SQL 中查找最具体的匹配行
How to Find the Most Specific Matching Row in Oracle SQL
我需要能够 运行 一个只允许我找到最具体匹配的查询。我的意思是我有一个包含主题、类别和类型列的 table,我想编写一个查询,该查询将 select 仅匹配所有 3 个列的行。如果没有匹配所有 3 列的行,它将 select 匹配主题和类别的行。如果没有类别,它将匹配主题的 select 行。
我想我已经看到一些使用 LEAST 函数的东西看起来与此类似:
SELECT LEAST(
(SELECT * FROM TABLE_1 WHERE AMT < 10),
(SELECT * FROM TABLE_1 WHERE AMT > 10)
)
所以我只是想知道是否可以做类似的事情来找到最具体的匹配项,或者是否需要其他方法。
在此先感谢您的帮助。
如果只需要一行,可以在限制较少的条件下过滤table,然后用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
代替。
我需要能够 运行 一个只允许我找到最具体匹配的查询。我的意思是我有一个包含主题、类别和类型列的 table,我想编写一个查询,该查询将 select 仅匹配所有 3 个列的行。如果没有匹配所有 3 列的行,它将 select 匹配主题和类别的行。如果没有类别,它将匹配主题的 select 行。
我想我已经看到一些使用 LEAST 函数的东西看起来与此类似:
SELECT LEAST(
(SELECT * FROM TABLE_1 WHERE AMT < 10),
(SELECT * FROM TABLE_1 WHERE AMT > 10)
)
所以我只是想知道是否可以做类似的事情来找到最具体的匹配项,或者是否需要其他方法。
在此先感谢您的帮助。
如果只需要一行,可以在限制较少的条件下过滤table,然后用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
代替。