我需要生成一个数字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
答案 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;