Как выбрать из текстового списка случайно? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь построить 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 что-то подобное или нет.

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Вот один из способов:

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, вы можете разделить только один символ. Поэтому я предполагаю, что запятая будет здесь разделителем.

0 голосов
/ 10 апреля 2020
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;
0 голосов
/ 10 апреля 2020

Вам не нужно создавать таблицы вообще. Просто поместите число внутри вашей строки и выберите случайное число:

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'

с

...