SQL SELECT, um die ersten N positiven ganzen Zahlen zu erhalten

Ich brauche eine Ergebnismenge, die die ersten N positiven ganzen Zahlen enthält. Ist es möglich, nur die SQL-SELECT-statement zu verwenden, um sie zu erhalten (ohne Angabe einer Zählertabelle)?

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

Scheint, dass du ein dummy rowset .

In MySQL ist es unmöglich, ohne einen Tisch zu haben.

Die meisten Hauptsysteme bieten eine Möglichkeit, dies zu tun:

  • In Oracle :

     SELECT level FROM dual CONNECT BY level < = 10 
  • In SQL Server :

     WITH q AS ( SELECT 1 AS num UNION ALL SELECT num + 1 FROM q WHERE num < 10 ) SELECT * FROM q 
  • In PostgreSQL :

     SELECT num FROM generate_series(1, 10) num 

MySQL etwas nicht und das ist ein gravierender Nachteil.

Ich habe ein einfaches Skript geschrieben, um Testdaten für die Beispieltabellen in meinen Blog-Posts zu generieren, vielleicht wird es nützlich sein:

 CREATE TABLE filler ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT ) ENGINE=Memory; CREATE PROCEDURE prc_filler(cnt INT) BEGIN DECLARE _cnt INT; SET _cnt = 1; WHILE _cnt < = cnt DO INSERT INTO filler SELECT _cnt; SET _cnt = _cnt + 1; END WHILE; END $$ 

Sie rufen die Prozedur auf und die Tabelle wird mit den Zahlen gefüllt.

Sie können es während der Dauer der Sitzung wiederverwenden.

Eine mögliche Lösung (zugegebenermaßen nicht sehr elegant) ist es, jede Tabelle mit einer ausreichend großen Anzahl von Datensätzen zu verwenden.

Für die ersten 10 Ganzzahlen (die mysql.help_relation verwenden, aber jede Tabelle würde ausreichen) könnten Sie die folgende Abfrage verwenden:

 SELECT @N := @N +1 AS integers FROM mysql.help_relation , (SELECT @N:=0) dum LIMIT 10; 

Dies könnte auch in einer function platziert werden, die Min und Max nimmt.

Sonderbare Lösung, aber …

 SELECT 1 UNION SELECT 2 UNION SELECT 3.... 

Die Sequenz, die ich vorschlage, erlaubt dem Programmierer, die folgende Abfrage auszuführen:

 select value from sequence where value>=15 and value<100; 

Und um die erwarteten Ergebnisse zu erhalten: Die Folge von ganzen Zahlen zwischen 15 (inklusive) und 100 (exklusiv).

Wenn Sie das möchten, müssen Sie die folgenden zwei Ansichten erstellen, die Sie nur einmal deklarieren:

 create view digits as select 0 n union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9; create view sequence as select u.n+tn*10+hn*100 as value from digits as u cross join digits as t cross join digits as h; 

So haben Sie Ihre Sequenz mit einem intuitiven SELECT ...

Ich hoffe es hilft.

Nehmen wir an, Sie meinen, sie von einer Tabelle abzurufen, dann ist hier N gleich 10, wenn angenommen wird, dass die Spalte mit Zahlen darin steht.

 SELECT intcolumn FROM numbers WHERE intcolumn > 0 LIMIT 10 

Edit : Wenn Sie tatsächlich den mathematischen Satz von positiven Zahlen ohne eine Tabelle suchen würden, würde ich es noch einmal überdenken, es kann intensiv sein (abhängig von der Implementierung). Eine gängige Praxis scheint es zu sein, eine Nachschlagetabelle voller Zahlen zu erstellen und dann die obige Abfrage zu verwenden.

Dies kann helfen

Um eine zufällige ganze Zahl R im Bereich i < = R

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

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

 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; 

das wird die ersten Millionen Zahlen erzeugen. Wenn Sie nur die positiven Zahlen benötigen, fügen Sie einfach + 1 zum Ausdruck hinzu.

Beachten Sie, dass die Ergebnisse in MySQL insbesondere nicht sortiert sind. Sie müssen die order by n anhängen order by n wenn Sie eine bestellte Nummer benötigen. Dies erhöht die Ausführungszeit dramatisch (auf meinem Rechner sprang es von 5 ms auf 500 ms).

Für einfache Abfragen finden Sie hier nur die ersten 10000-Nummern:

 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 wird von der folgenden Abfrage angepasst, die einen Datumsbereich zurückgibt: https://stackoverflow.com/a/2157776/2948

Ich bin mir ziemlich sicher, dass du es nicht schaffst, wenn ich deine Frage richtig verstehe.

Wie ich Ihre Frage verstehe, wollen Sie die Liste aus einer einzigen SQL-statement, ohne auf eine bestimmte Tabelle verweisen zu müssen?

Ich bin mir ziemlich sicher, dass dies in keinem SQL-Dialekt möglich ist. Wenn Sie eine sequentiell steigende Zahl zusammen mit den Ergebnissen einer anderen Abfrage erhalten würden, dann wäre das möglich (je nach SQL-Dialekt, auf mssql wäre es rownumber ()), aber ich weiß nicht, wie in MySql, aber es ist wahrscheinlich Dort)

Aber das ist nicht das was ich höre du fragst?

Werfen Sie einen Blick auf die folgenden SO Fragen:

  • Wie man einen Bereich von Zahlen in Mysql erzeugt
  • Generiere eine Integer-Sequenz in MySQL

Bearbeiten:

Eine weitere Möglichkeit besteht darin, eine gespeicherte Prozedur zu erstellen, die das für Sie erledigt. PostgreSQL enthält eine function generate_series (start, stop), die das macht, was Sie wollen.

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

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

Wenn Ihre database analytische Fensterfunktionen unterstützt, funktioniert Folgendes ganz einfach:

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

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