Bu soruda üzerinde çalıştığım bir test sorgusu için yaklaşımım işe yaramadığından, şimdi başka bir şey deniyorum. Pg random()
işlevinin bana yalnızca 1 ile 10 arasındaki sayıları vermesini söylemenin bir yolu var mı ?
Yanıtlar:
1 ile 10 arasındaki sayılarla> = 1 ve <10 olan herhangi bir float'ı kastediyorsanız, o zaman kolaydır:
select random() * 9 + 1
Bu, aşağıdakilerle kolayca test edilebilir:
# select min(i), max(i) from (
select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
min | max
-----------------+------------------
1.0000083274208 | 9.99999571684748
(1 row)
> = 1 ve <10 olan tam sayılar istiyorsanız, o zaman basit:
select trunc(random() * 9 + 1)
Ve yine, basit test:
# select min(i), max(i) from (
select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
min | max
-----+-----
1 | 9
(1 row)
trunc()
girişle aynı veri türünü döndürür (kılavuzda belirtildiği gibi). trunc(random() * 20)::int
random()
nedeniyle, 9 ile çarpıldığında> = 9 olacak şekilde <1 değerini döndürebilecek mi? Uygulamada, mümkün olsa bile, 15 basamak kadar hassasiyet nedeniyle, elbette yok olma olasılığı düşüktür.
Özetlemek ve biraz basitleştirmek için şunları kullanabilirsiniz:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Ve bunu @ user80168 tarafından belirtildiği gibi test edebilirsiniz.
-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;
ceil(random() * 10)
0 sonuçlanan - ı sadık kalacağına floor
.
SELECT floor(random() * 10 + 1);
SQL Server kullanıyorsanız tamsayı almanın doğru yolu
SELECT Cast(RAND()*(b-a)+a as int);
Nerede
(kısa (rastgele () * 10)% 10) + 1
Hythlodayr'ın cevabının doğru versiyonu.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Kaynağından gelen çıktı trunc
dönüştürülmelidir INTEGER
. Ama onsuz da yapılabilir trunc
. Yani basit olduğu ortaya çıkıyor.
select (random() * 9)::INTEGER + 1
[1, 10] aralığında bir INTEGER çıkışı üretir, yani hem 1 hem de 10 dahil.
Herhangi bir sayı (kayan) için user80168'in cevabına bakın. yani sadece onu dönüştürmeyin INTEGER
.
Aslında bunu istediğini bilmiyorum.
bunu dene
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Bu saklı yordam, tabloya bir rand numarası ekler. Dikkat edin, sonsuz sayılar ekler. Yeterli sayıda numara aldığınızda yürütmeyi bırakın.
imleç için bir tablo oluşturun:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
GİT
Numaralarınızı içerecek bir tablo oluşturun:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
Senaryoyu Girmek:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
PROSEDÜRÜN YARATILMASI VE UYGULANMASI:
CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare CURSE CURSOR FOR (SELECT [Cursor] FROM [dbo].[SearchIndex] WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript
WHILE @@FETCH_STATUS IS NOT NULL
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;
END
END
GO
Masanızı doldurun:
EXEC RandNumbers