Oracle SQL:分层WHERE ... IN

oxiaedzo  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(164)

我有一个选择语句,我在某个字段上查找

select * from table t
where t.field in ('val1', 'val2', 'val3')

我想以这样的方式进行子集,如果列的值为val1,它应该返回给定的行,否则它应该返回值为val2的行,最后返回值为val3的行。所以一个有序的哪里条款可以这么说。这可能吗

t1qtbnec

t1qtbnec1#

要获取所有val1行,如果不存在,则获取所有val2行,如果不存在,则获取所有val3行,然后从Oracle 12中,您可以使用ORDER BYFETCH FIRST ROW WITH TIES

SELECT *
FROM   table
ORDER BY field
FETCH FIRST ROW WITH TIES;

如果你的优先级不是按升序排列的,那么使用CASE表达式:

SELECT *
FROM   table
ORDER BY
       CASE field
       WHEN 'val1' THEN 1
       WHEN 'val2' THEN 2
       WHEN 'val3' THEN 3
       END
FETCH FIRST ROW WITH TIES;

在早期版本中,您可以使用RANK解析函数:

SELECT *
FROM   (
  SELECT t.*,
         RANK() OVER (
           ORDER BY CASE field
                    WHEN 'val1' THEN 1
                    WHEN 'val2' THEN 2
                    WHEN 'val3' THEN 3
                    END
         ) AS rnk
  FROM   table t
)
WHERE  rnk = 1;

相关问题