2012-09-11 28 views
0

什么是随机选择SQL Server查询中返回的五个固定字符串之一的最简单方法?在SQL查询中修复了数组和随机数

I.e.相当于:

function randomColumn() { 
    var values = ['apple', 'banana', 'orange', 'cherry', 'lemon']; 
    var idx = Math.floor(Math.random() * 5); 
    return values[idx]; 
} 

我需要改变我现有的SQL脚本有一定的列返回这些值中的一个,而不需要改变我的客户端代码。

我需要创建临时表吗?

我正在使用SQL Server 2008 R2。

+0

我想你可能想要调整你的随机数的上限 - 你的一组值是5个元素长。 –

+0

@ X-Zero:我将它写为一个JavaScript示例(它使用[基于零的索引](http://programmers.stackexchange.com/questions/110804/why-are-zero-based-arrays-the-norm )),所以我自动做了这个,没有太多的想法。是的,'Math.floor'和'5'一起效果最好。但我认为它反映了基本的意图。 – Lou

+0

对不起,有点因为我正在读'Math.round()'为'Math.floor()'(一个循环)。当然,假设乘以随机双数所得到的值的分布是均匀的,那么您的端点(0,4)将大约是列表中其他任何元素的一半。 –

回答

3

你并不需要一个临时表弦数,你可以即时创建结果:

select str 
from (
    select 0 as id, 'apple' as str 
    union all 
    select 1, 'banana' 
    union all 
    select 2, 'orange' 
    union all 
    select 3, 'cherry' 
    union all 
    select 4, 'lemon' 
) x 
where id = floor(rand() * 5) 
1
Select 'apple' values 
INTO #tmp 
UNION ALL 
Select'banana' values 
UNION ALL 
Select 'orange' values  
. 
. 
. 
select top 1 values 
from #tmp 
order by newid() 

OR

ALTER TABLE #tmp 
ADD id BIGINT IDENTITY(1,1) 
DECLARE @rand BIGINT 

SET @rand=rand()*4 

select top 1 values 
from #tmp 
where [email protected] 
0
DECLARE @ListofIDs TABLE(IDs VARCHAR(100), ID INT IDENTITY(1,1)); 
INSERT INTO @ListofIDs 
SELECT 'a' 
UNION ALL 
SELECT 'b' 
UNION ALL 
SELECT '20' 
UNION ALL 
SELECT 'c' 
UNION ALL 
SELECT '30' 
UNION ALL 
SELECT 'd'; 
SELECT * FROM @ListofIDs; 

SELECT Ids from @ListofIDs where ID=1+ CONVERT(INT, (5)*RAND())