Sql 如何从文本列表中随机选择?

Sql 如何从文本列表中随机选择?,sql,sql-server,tsql,sql-function,string-function,Sql,Sql Server,Tsql,Sql Function,String Function,我正在尝试构建可以用作列的默认值的SQL函数。该功能是关于在用户未分配图像的情况下随机选择化身图像路径 我尝试过,但这是一个完全错误的例子,仅仅是接近图像而不是解决方案 我需要做的就是这样 select top 1 from "avatar1,png, avatar2,png, avatar3.png, avatar4.png, avatar5.png" order by rand(); 我会把它转换成这样的函数 CREATE FUNCTION dbo.ReturnAvatar() RET

我正在尝试构建可以用作列的默认值的SQL函数。该功能是关于在用户未分配图像的情况下随机选择化身图像路径

我尝试过,但这是一个完全错误的例子,仅仅是接近图像而不是解决方案

我需要做的就是这样

select top 1 from "avatar1,png, avatar2,png, avatar3.png, avatar4.png, avatar5.png"  order by rand();
我会把它转换成这样的函数

CREATE FUNCTION dbo.ReturnAvatar() 
RETURNS nvarchar(100)
AS   
BEGIN  
    DECLARE @ret nvarchar(100);  
        SET @ret = (select top 1 from "avatar1,png, avatar2,png, avatar3.png, avatar4.png, avatar5.png" as tbl order by rand());  
    RETURN @ret;  
END; 
这只是为了解释我无法应用的想法。我不知道SQL server是否有类似的功能

这里有一种方法:

CREATE VIEW getNewID AS SELECT newid() as new_id

CREATE FUNCTION dbo.ReturnAvatar() 
RETURNS nvarchar(100)
AS   
BEGIN  
    DECLARE @ret nvarchar(100);  
        SET @ret = (SELECT TOP 1 value
                    FROM
                        STRING_SPLIT('avatar1.png,avatar2.png,avatar3.png,avatar4.png,avatar5.png', ',')
                    ORDER BY (SELECT new_id FROM getNewID));
    RETURN @ret;  
END;

请注意,您当前的CSV文件名字符串似乎不正确,因为逗号并不表示Windows或Linux中扩展的开始。所以,我假设点无处不在。此外,如果要使用
STRING\u SPLIT
,则只能对单个字符进行拆分。因此,我假设逗号将是这里的分隔符。

您根本不需要创建表。只需将数字放入字符串中,然后随机选择数字:

select 'avatar'+str(round(rand()*5+1,0))+'.png'
好的

把它放到你的功能中,你就一切就绪了

rand()
生成0..1(不包括),因此您只需将其乘以5,再加上1即可得到1…5的范围

演示:


文件:

所以基本上你可以把它归结为:

 select 'avatar'+ltrim(str(rand()*5+1,20,0))+'.png'

  • 照顾空间

你的SQl Server版本是什么?
avatar1,png
逗号是打字错误吗?@Honeybacker yesit的简单而伟大的方式。结果中有空格,但没关系,我替换了它(选择替换((选择“avatar”+str(round(rand()*5+1,0))+'.png'),'')。但是,如果您有时间为包含的功能添加一些解释,我们将不胜感激。谢谢。@MOHAMEDABUELATTA添加了函数,删除了
round()
,因为您可以在
str()
中执行此操作,并引入
trim()
来删除数字前面的空格。hth。您可能需要添加一些解释,解释为什么您通过视图订购。我花的时间比我愿意承认的要长一点。
create function dbo.ReturnAvatar(@uid uniqueidentifier, @avatars int = 10)
returns varchar(100)
as 
begin 
    return ('avatar' + cast(abs(checksum(@uid)) % isnull(abs(@avatars), 10)+1 as varchar(100)) + '.png')
end
go

create table myusers
(
username varchar(50),
theavatar varchar(100) default( dbo.ReturnAvatar(newid(), default))
);

insert into myusers(username)
select top (10000) 'user' + cast(row_number() over(order by(select null)) as varchar(50))
from master.dbo.spt_values as a
cross join master.dbo.spt_values as b;
go

select theavatar, count(*)
from myusers
group by theavatar;
go

drop table myusers;