Puisque mon approche pour une requête test sur laquelle j'ai travaillé dans cette question n'a pas fonctionné, j'essaie autre chose maintenant. Existe-t-il un moyen de dire à la fonction random()
de pg de ne me donner que des nombres compris entre 1 et 10?
Si vous entendez par un nombre compris entre 1 et 10 un nombre> = 1 et <10, alors c'est facile:
select random() * 9 + 1
Ceci peut être facilement testé avec:
# 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)
Si vous voulez des entiers, qui sont> = 1 et <10, c'est simple:
select trunc(random() * 9 + 1)
Et encore, test simple:
# 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)
Pour résumer et un peu simplifier, vous pouvez utiliser:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Et vous pouvez tester cela comme mentionné par @ 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;
Si vous utilisez SQL Server, le moyen correct d'obtenir un entier est
SELECT Cast(Rand()*(b-a)+a as int);
Où
(tronc (aléatoire () * 10)% 10) + 1
La version correcte de la réponse de hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
La sortie de trunc
doit être convertie en INTEGER
. Mais cela peut être fait sans trunc
. Donc, cela s'avère simple.
select (random() * 9)::INTEGER + 1
Génère une sortie INTEGER dans la plage [1, 10], à savoir les valeurs 1 et 10 incluses.
Pour un nombre quelconque (floats), voir la réponse de user80168. c'est-à-dire, ne le convertissez pas en INTEGER
.
En fait, je ne sais pas si vous voulez ça.
essaye ça
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Cette procédure stockée insère un nombre Rand dans une table. Attention, cela insère un nombre infini. Arrêtez de l'exécuter quand vous aurez assez de chiffres.
créer une table pour le curseur:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
ALLER
Créez un tableau pour contenir vos numéros:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
INSERTION DU SCRIPT:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(Rand() * 9 + 1) SELECT COUNT (ID) FROM ID
CRÉATION ET EXÉCUTION DE LA PROCÉDURE:
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
Remplissez votre tableau:
EXEC RandNumbers