Ponieważ moje podejście do zapytania testowego, nad którym pracowałem w tym pytaniu, nie wyszło, próbuję teraz czegoś innego. Czy istnieje sposób, aby powiedzieć random()
funkcji pg, aby otrzymywała tylko liczby od 1 do 10?
Ponieważ moje podejście do zapytania testowego, nad którym pracowałem w tym pytaniu, nie wyszło, próbuję teraz czegoś innego. Czy istnieje sposób, aby powiedzieć random()
funkcji pg, aby otrzymywała tylko liczby od 1 do 10?
Odpowiedzi:
Jeśli przez liczby od 1 do 10 masz na myśli dowolną liczbę zmiennoprzecinkową> = 1 i <10, to jest to łatwe:
select random() * 9 + 1
Można to łatwo przetestować za pomocą:
# 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)
Jeśli chcesz liczb całkowitych, czyli> = 1 i <10, to jest proste:
select trunc(random() * 9 + 1)
I znowu, prosty 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()
zwraca ten sam typ danych co wejście (zgodnie z opisem w instrukcji). Musisz rzutować wynik na liczbę całkowitą:trunc(random() * 20)::int
random()
że zwróci wartość <1, która po pomnożeniu przez 9 będzie> = 9 ze względu na niedokładną naturę typu podwójnej precyzji ? W praktyce, nawet jeśli jest to możliwe, byłoby to bardzo mało prawdopodobne z powodu 15-cyfrowej dokładności.
Podsumowując i nieco upraszczając, możesz użyć:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Możesz to przetestować, jak wspomniał @ user80168
-- 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)
na 0 - trzymałbym się floor
.
SELECT floor(random() * 10 + 1);
Jeśli używasz programu SQL Server, prawidłowym sposobem uzyskania liczby całkowitej jest
SELECT Cast(RAND()*(b-a)+a as int);
Gdzie
(trunc (random () * 10)% 10) + 1
Prawidłowa wersja odpowiedzi hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Dane wyjściowe z trunc
muszą zostać przekonwertowane na INTEGER
. Ale można to zrobić bez trunc
. Okazuje się więc, że jest to proste.
select (random() * 9)::INTEGER + 1
Generuje wyjście typu INTEGER w zakresie [1, 10], czyli zarówno 1, jak i 10 włącznie.
Dla dowolnej liczby (zmiennoprzecinkowej) zobacz odpowiedź użytkownika80168. tzn. po prostu nie konwertuj go na INTEGER
.
Właściwie nie wiem, że tego chcesz.
Spróbuj tego
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Ta procedura składowana wstawia numer rand do tabeli. Uważaj, wstawia nieskończone liczby. Przestań go wykonywać, gdy uzyskasz wystarczającą liczbę liczb.
utwórz tabelę dla kursora:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
UDAĆ SIĘ
Utwórz tabelę zawierającą swoje liczby:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
WSTAWIANIE SKRYPTU:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
TWORZENIE I WYKONANIE PROCEDURY:
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
Wypełnij swój stół:
EXEC RandNumbers