Sql 特定于Oracle的排序

Sql 特定于Oracle的排序,sql,oracle,Sql,Oracle,我有以下问题: 我需要对一些产品进行排序,其中一个需要是特定的行,另一个需要是随机的 因此,如果我有产品:A B C D,我需要例如B作为第三个产品,而其他产品可以是随机的,比如: C 1 A 2 B 3 D 4 我尝试过的最佳镜头是3是动态值: SELECT product_name, CASE WHEN product = 'B' THEN 3 ELSE ( CASE WHEN rownum < 3 THEN rownum EL

我有以下问题: 我需要对一些产品进行排序,其中一个需要是特定的行,另一个需要是随机的

因此,如果我有产品:A B C D,我需要例如B作为第三个产品,而其他产品可以是随机的,比如:

C  1
A  2
B  3
D  4
我尝试过的最佳镜头是3是动态值:

SELECT
    product_name,
    CASE
        WHEN product = 'B' THEN 3
        ELSE ( CASE WHEN rownum < 3 THEN rownum ELSE rownum + 1 END )
    END sorting
FROM
    products
ORDER BY
    sorting ASC;
但我并不是总能得到想要的结果


感谢您的帮助或指导。

这是一个相当棘手的问题,但您可以使用行数和一系列算术:

select p.*
from (select p.*,
             row_number() over (order by case when product = 'B' then 2 else 1 end),
                                         dbms_random.value
                               ) as seqnum
      from products p
     ) p
order by (case when seqnum < 3 then seqnum end),
         (case when product = 'B' then 1 else 2 end),
         seqnum;
逻辑是:

随机枚举值,特殊值排在最后。 放入值较低的行。 将特殊值放入行中。 把剩下的一排放进去。 上面使用了子查询,因为随机性是强制的。您可以在不使用子查询的情况下执行此操作,如下所示:

order by (case when row_number() over (order by (case when product = 'B' then 2 else 1 end) < 3
               then dbms_random.value
               else 2  -- bigger than value
          end),
         (case when product = 'B' then 1 else 2 end),
         dbms_random.value;

在您的查询中,您在哪里使用随机数?rownum是在何处定义或如何生成的?提示:您不需要在何时使用嵌套大小写:您可以使rownum<3成为表达式顶部大小写中的第二个大小写。随机的意思是其他产品如何排序并不重要。我只希望它们位于1到1个产品之间,其中一行由我指定。我希望我很清楚。@ErgiNushi。这是一个非常有趣的问题。谢谢你的回答。事实上,随机性并不是强制性的。我只需要特定的产品在我暗示的特定的地方。其他产品可以在一个随机顺序之间的1-我的产品数量。就像我在问题中提到的。@ErgiNushi。这不是这个答案的一个重要部分,但是你的问题确实是随机的,所以我把它包括进去了。在做了一些修改后,这个问题非常有效。非常感谢:D