如何从文本列表中随机 select?
How to select from text list randomly?
我正在尝试构建 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 服务器是否有类似的东西。
这是一种方法:
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
,则只能在单个字符上拆分。因此,我假设逗号将是此处的分隔符。
您根本不需要创建 table。只需将数字放入字符串中并随机选择数字即可:
select 'avatar'+str(round(rand()*5+1,0))+'.png'
就好了。
将其放入您的函数中,一切就绪。
rand()
产生 0..1(excl.) 所以你可以简单地将它乘以 5 然后加 1 得到你的范围 1...5
演示:http://sqlfiddle.com/#!18/9eecb/82866
文档:
- ROUND ( numeric_expression , length [ ,function ] )
- STR ( float_expression [, length [, decimal]])
- rand(seed)
所以基本上你可以把它归结为:
select 'avatar'+ltrim(str(rand()*5+1,20,0))+'.png'
和
- ltrim(string) 照顾 space
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;
我正在尝试构建 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 服务器是否有类似的东西。
这是一种方法:
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
,则只能在单个字符上拆分。因此,我假设逗号将是此处的分隔符。
您根本不需要创建 table。只需将数字放入字符串中并随机选择数字即可:
select 'avatar'+str(round(rand()*5+1,0))+'.png'
就好了。
将其放入您的函数中,一切就绪。
rand()
产生 0..1(excl.) 所以你可以简单地将它乘以 5 然后加 1 得到你的范围 1...5
演示:http://sqlfiddle.com/#!18/9eecb/82866
文档:
- ROUND ( numeric_expression , length [ ,function ] )
- STR ( float_expression [, length [, decimal]])
- rand(seed)
所以基本上你可以把它归结为:
select 'avatar'+ltrim(str(rand()*5+1,20,0))+'.png'
和
- ltrim(string) 照顾 space
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;