Da mein Ansatz für eine Testabfrage, an der ich in diese Frage gearbeitet habe, nicht geklappt hat, versuche ich jetzt etwas anderes. Gibt es eine Möglichkeit, der Funktion random()
von pg mitzuteilen, dass nur Zahlen zwischen 1 und 10 angezeigt werden?
Wenn Sie mit Zahlen zwischen 1 und 10 einen Float von> = 1 und <10 meinen, dann ist es einfach:
select random() * 9 + 1
Dies kann leicht getestet werden mit:
# 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)
Wenn Sie Ganzzahlen wünschen, die> = 1 und <10 sind, ist es einfach:
select trunc(random() * 9 + 1)
Und nochmal ein einfacher 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)
Zusammenfassend und ein wenig vereinfachend können Sie Folgendes verwenden:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Und Sie können dies wie von @ user80168 erwähnt testen
-- 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;
Wenn Sie SQL Server verwenden, ist der korrekte Weg, Integer zu erhalten, korrekt
SELECT Cast(Rand()*(b-a)+a as int);
Woher
(Trunk (zufällig () * 10)% 10) + 1
Die richtige Version der Antwort von hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Die Ausgabe von trunc
muss in INTEGER
konvertiert werden. Es ist aber auch ohne trunc
möglich. Es stellt sich also als einfach heraus.
select (random() * 9)::INTEGER + 1
Erzeugt eine INTEGER-Ausgabe im Bereich [1, 10], d. H. Sowohl 1 als auch 10.
Für eine beliebige Anzahl (Floats) siehe die Antwort von user80168. konvertieren Sie es einfach nicht in INTEGER
.
Eigentlich weiß ich nicht, dass du das willst.
versuche dies
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Diese gespeicherte Prozedur fügt eine Rand-Nummer in eine Tabelle ein. Achtung, es fügt eine unendliche Zahl ein. Beenden Sie die Ausführung, wenn Sie genügend Zahlen erhalten haben.
erstellen Sie eine Tabelle für den Cursor:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
GEHEN
Erstellen Sie eine Tabelle mit Ihren Nummern:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
EINSETZEN DES SCRIPT:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(Rand() * 9 + 1) SELECT COUNT (ID) FROM ID
ERSTELLEN UND AUSFÜHREN DES VERFAHRENS:
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
Füllen Sie Ihren Tisch:
EXEC RandNumbers