Como minha abordagem para uma consulta de teste na qual trabalhei nesta questão não funcionou, estou tentando outra coisa agora. Existe uma maneira de dizer à random()
função da página para obter apenas números entre 1 e 10?
Como minha abordagem para uma consulta de teste na qual trabalhei nesta questão não funcionou, estou tentando outra coisa agora. Existe uma maneira de dizer à random()
função da página para obter apenas números entre 1 e 10?
Respostas:
Se por números entre 1 e 10 você quer dizer qualquer float> = 1 e <10, então é fácil:
select random() * 9 + 1
Isso pode ser facilmente testado com:
# 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)
Se você quiser números inteiros, que são> = 1 e <10, é simples:
select trunc(random() * 9 + 1)
E novamente, teste simples:
# 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()
retorna o mesmo tipo de dados da entrada (conforme declarado no manual). Você precisa converter o resultado para um inteiro:trunc(random() * 20)::int
random()
retornasse um valor <1 que quando multiplicado por 9 seria> = 9 devido à natureza inexata do tipo de precisão dupla ? Na prática, mesmo que fosse possível, seria extremamente improvável, é claro, por causa da precisão de 15 dígitos ou mais.
Para resumir e simplificar um pouco, você pode usar:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
E você pode testar isso como mencionado por @ 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)
resultar em 0 - eu ficaria com floor
.
SELECT floor(random() * 10 + 1);
Se você estiver usando o SQL Server, a maneira correta de obter o inteiro é
SELECT Cast(RAND()*(b-a)+a as int);
Onde
(trunc (aleatório () * 10)% 10) + 1
A versão correta da resposta de hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
A saída de trunc
deve ser convertida em INTEGER
. Mas isso pode ser feito sem trunc
. Portanto, é simples.
select (random() * 9)::INTEGER + 1
Gera uma saída INTEGER no intervalo [1, 10], ou seja, 1 e 10 inclusive.
Para qualquer número (flutuantes), consulte a resposta do usuário80168. ou seja, apenas não converta para INTEGER
.
Na verdade, não sei se você quer isso.
tente isso
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Este procedimento armazenado insere um número rand em uma tabela. Cuidado, ele insere uma infinidade de números. Pare de executá-lo quando obter números suficientes.
crie uma tabela para o cursor:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
IR
Crie uma tabela para conter seus números:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
INSERINDO O SCRIPT:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
CRIANDO E EXECUTANDO O PROCEDIMENTO:
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
Encha a sua mesa:
EXEC RandNumbers