16 Stimmen

SQL SELECT, um die ersten N positiven Ganzzahlen zu erhalten

Ich muss einen Ergebnissatz erhalten, der die ersten N positiven ganzen Zahlen enthält. Ist es möglich, nur die Standard-SQL-SELECT-Anweisung zu verwenden, um sie zu erhalten (ohne eine Count-Tabelle bereitzustellen)?

Wenn es nicht möglich ist, gibt es einen spezifischen MySQL-Weg, dies zu erreichen?

0 Stimmen

Erstens, in welcher Definition?

1voto

Garry Punkte 573

Dies könnte helfen

Um eine Zufallszahl R im Bereich i <= R < j zu erhalten, verwenden Sie den Ausdruck FLOOR(i + RAND() * (j - i)). Zum Beispiel, um eine Zufallszahl im Bereich 7 <= R < 12 zu erhalten, könnten Sie die folgende Anweisung verwenden:

SELECT FLOOR(7 + (RAND() * 5));

0 Stimmen

Er fragt nach aufeinanderfolgenden, positiven ganzen Zahlen. Nicht nach zufälligen.

1voto

Antti Kissaniemi Punkte 18474

Wenn Sie wissen, dass N begrenzt ist (und normalerweise ist es das), können Sie eine Konstruktion wie diese verwenden:

select (a.digit + (10 * b.digit) + (100 * c.digit) + (1000 * d.digit) + (10000 * e.digit) + (100000 * f.digit)) as n
    from (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as e
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as f;

was die ersten eine Million Zahlen generiert. Wenn Sie nur die positiven Zahlen benötigen, fügen Sie einfach + 1 zum Ausdruck hinzu.

Beachten Sie, dass die Ergebnisse insbesondere in MySQL möglicherweise nicht sortiert sind. Sie müssen order by n am Ende anhängen, wenn Sie sortierte Zahlen benötigen. Dies wird jedoch die Ausführungszeit dramatisch erhöhen (auf meinem Rechner stieg sie von 5 ms auf 500 ms).

Für einfache Abfragen hier eine Abfrage für nur die ersten 10000 Zahlen:

select (a.digit + (10 * b.digit) + (100 * c.digit) + (1000 * d.digit)) as n
    from (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as digit union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d;

Diese Antwort stammt von der folgenden Abfrage, die einen Datumsbereich zurückgibt: https://stackoverflow.com/a/2157776/2948

0voto

Frank Bollack Punkte 23412

Schauen Sie sich die folgenden SO-Fragen an:

Bearbeiten:

Ein weiterer Ansatz ist die Erstellung einer gespeicherten Prozedur, die dies für Sie durchführt. PostgreSQL enthält eine Funktion generate_series(start, stop), die das gewünschte Ergebnis liefert.

select * from generate_series(2,4);
 generate_series
-----------------
               2
               3
               4
(3 rows)

Ich bin nicht vertraut mit MySQL, aber so etwas sollte einfach zu implementieren sein, wenn Sie mit SPs einverstanden sind. Diese Seite zeigt eine Implementierung.

0 Stimmen

Es scheint, als ob beide Methoden eine Suchtabelle in irgendeiner Form erfordern (unter Verwendung von AUTO_INCREMENT)

0voto

Pete Punkte 12142

Ich bin ziemlich sicher, dass Sie es nicht tun können, wenn ich Ihre Frage richtig verstehe.

Wenn ich Ihre Frage richtig verstehe, möchten Sie die Liste aus einer einzigen SQL-Anweisung, ohne auf eine bestimmte Tabelle verweisen zu müssen?

Ich bin ziemlich sicher, dass es in keinem SQL-Dialekt möglich ist. Wenn Sie eine sequenziell ansteigende Nummer zusammen mit den Ergebnissen einer anderen Abfrage erhalten möchten, wäre das möglich (je nach SQL-Dialekt, bei MSSQL wäre es rownumber(), aber ich weiß nicht, wie es bei MySql geht, aber es ist wahrscheinlich vorhanden)

Aber das ist nicht das, was ich von Ihnen höre?

0 Stimmen

In PostgreSQL gibt es eine Funktion namens generate_series(start, stop), die genau das tut, was der OP möchte.

0voto

Wenn Ihre Datenbank Analysefensterfunktionen unterstützt, funktioniert das Folgende wirklich gut:

SELECT  row_number() over (partition by 1 order by 1) numbers
FROM SOME_TABLE
LIMIT 2700;

Diese Anweisung gibt eine Reihe von Zahlen von 1 bis 2700 zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X