【问题标题】:How to select from text list randomly?如何从文本列表中随机选择?
【发布时间】:2020-04-10 09:12:45
【问题描述】:

我正在尝试构建可以用作列的默认值的 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 是否有这样的东西。

【问题讨论】:

  • 您的 SQl Server 版本是多少?
  • avatar1,png 逗号打错了吗?
  • @HoneyBadger 是的

标签: sql sql-server tsql sql-function string-function


【解决方案1】:

这是一种方法:

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_SPLIT,你可以只拆分一个字符。因此,我假设逗号将是这里的分隔符。

【讨论】:

  • 您可能想要添加一些解释,说明您为什么通过视图订购。我花了比我愿意承认的时间更长的时间。
【解决方案2】:

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

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

会好的。

把它放到你的函数中,你就准备好了。

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

演示:http://sqlfiddle.com/#!18/9eecb/82866


文档:

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

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

【讨论】:

  • 这是一种简单而好方法。结果中有空间,但没关系,我替换了它 (SELECT REPLACE((select 'avatar'+str(round(rand()*5+1,0))+'.png'), ' ', '' ))。但是,如果您有时间为包含的功能添加一些解释,将不胜感激。谢谢。
  • @MOHAMEDABUELATTA 添加了功能,删除了round(),因为您可以在str() 中执行此操作,并引入trim() 以消除数字前面的空格。 hth.
【解决方案3】:
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;

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多