以随机顺序生成数字串

时间:2017-03-14 00:02:43

标签: sql oracle

我需要生成一个数字1-3的字符串,其中包含从表格中选择的每一行的随机顺序的数字。

我尝试了以下操作,但无法获取每行的随机数(它们在所有行中都相同)。

SELECT name
 , (SELECT LISTAGG( COLUMN_VALUE ) WITHIN GROUP ( ORDER BY dbms_random.value )
    FROM TABLE( SYS.ODCIVARCHAR2LIST( '1', '2', '3' ) )
   ) AS q_order
FROM tableA

期望的结果:

NAME        Q_ORDER
-------------------
Name1       123
Name2       312
Name3       213

我真正得到的是:

NAME        Q_ORDER
-------------------
Name1       312
Name2       312
Name3       312

版本:Oracle 11.2.0

2 个答案:

答案 0 :(得分:0)

像这样......(简单而有效)。第二列是一个字符串;如果您需要它作为数字,请将TO_NUMER()应用于它。当然,每次运行查询时,第二列中的值都将是不同的(值ARE确实是随机的!)

with
     tablea ( name ) as (
       select 'Name1' from dual union all
       select 'Name2' from dual union all
       select 'Name3' from dual
     )
select name,
       case floor(dbms_random.value(0, 6))
            when 0 then '123'
            when 1 then '132'
            when 2 then '213'
            when 3 then '231'
            when 4 then '312'
            else        '321' end as q_order
from   tablea
;

NAME   Q_ORDER
-----  -------
Name1  123
Name2  312
Name3  213

答案 1 :(得分:0)

您的方法可能会适用一些调整。 Oracle似乎正在优化代码应该为每一行运行的事实。

一种方法是包含外部引用以绕过此优化。我认为这已经足够了:

SELECT name,
       (SELECT LISTAGG( COLUMN_VALUE ) WITHIN GROUP ( ORDER BY dbms_random.value )
        FROM TABLE( SYS.ODCIVARCHAR2LIST( '1', '2', '3' ) )
        WHERE a.name is not null
       ) AS q_order
FROM tableA a;