Оскільки мій підхід до тестового запиту, над яким я працював у цьому питанні , не вийшов, зараз я намагаюся щось інше. Чи є спосіб сказати random()
функції pg, щоб отримати мені лише числа між 1 і 10?
Оскільки мій підхід до тестового запиту, над яким я працював у цьому питанні , не вийшов, зараз я намагаюся щось інше. Чи є спосіб сказати random()
функції pg, щоб отримати мені лише числа між 1 і 10?
Відповіді:
Якщо під числами від 1 до 10 ви маєте на увазі будь-який поплавок, який є> = 1 і <10, то це легко:
select random() * 9 + 1
Це можна легко перевірити за допомогою:
# 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 і <10, то це просто:
select trunc(random() * 9 + 1)
І знову простий тест:
# 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()
повертає той же тип даних, що і вхідний (як зазначено в посібнику). Потрібно привести результат до цілого числа:trunc(random() * 20)::int
random()
поверне значення <1, яке при множенні на 9 буде> = 9 через неточну природу типу подвійної точності ? На практиці, навіть якщо це можливо, це було б малоймовірно, звичайно, через 15-ти цифр або настільки точності.
Щоб узагальнити та трохи спростити, ви можете використовувати:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
І ви можете перевірити це, як згадував @ 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)
0 - я б дотримувався floor
.
SELECT floor(random() * 10 + 1);
Якщо ви використовуєте SQL Server, то правильним способом отримання цілого числа є
SELECT Cast(RAND()*(b-a)+a as int);
Де
(магістраль (випадковий () * 10)% 10) + 1
Правильна версія відповіді гітлодаря.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Вихід з trunc
повинен бути перетворений в INTEGER
. Але це можна зробити і без trunc
. Тож це виявляється просто.
select (random() * 9)::INTEGER + 1
Створює вихід INTEGER в діапазоні [1, 10], тобто як 1 і 10 включно.
Про будь-яке число (плаває) дивіться відповідь користувача80168. тобто просто не перетворюйте його наINTEGER
.
Насправді я не знаю, ти цього хочеш.
спробуйте це
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Ця збережена процедура вставляє номер ранду в таблицю. Дивіться, вона вставляє нескінченні числа. Перестаньте виконувати його, коли ви отримаєте достатню кількість.
створити таблицю для курсору:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
ПОВЕРНУТИСЯ
Створіть таблицю, яка містить ваші номери:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
ВСТАВКА СКРИПТА:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
Створення та виконання процедури:
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
Заповніть свою таблицю:
EXEC RandNumbers