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?

21voto

Quassnoi Punkte 396418

Sieht so aus, als ob du ein Dummy-Rowset möchtest.

In MySQL ist dies ohne Tabelle unmöglich.

Die meisten großen Systeme bieten eine Möglichkeit dazu:

  • 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 fehlt so etwas und das ist ein ernster Nachteil.

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

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
$$

Du rufst die Prozedur auf und die Tabelle wird mit den Zahlen gefüllt.

Du kannst sie während der gesamten Sitzung wiederverwenden.

0 Stimmen

Tolle Antwort. Das ist sicher hilfreich.

10voto

luigi Punkte 101

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

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

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

Dies könnte auch in einer Funktion platziert werden, die Min und Max akzeptiert.

1 Stimmen

Vielen Dank für den Tipp. Ich habe erfolgreich folgendes verwendet, um einen Zeitraum von Daten zu erhalten: SELECT @i:=DATE_SUB(@i, INTERVAL 1 DAY) date FROM mysql.help_relation, (SELECT @i:=CURRENT_DATE) v WHERE @i > DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH);.

0 Stimmen

Dies ist keine generische Lösung. Es funktioniert, vorausgesetzt, die verwendete Tabelle hat mindestens die Anzahl der Zeilen, die Sie erhalten möchten. Erstellen Sie eine Dummy-Tabelle ohne Zeilen, und SELECT @N:=@N + 1 AS integers FROM dummy, (SELECT @N:=0) dum LIMIT 10 produziert keine Zeilen.

0 Stimmen

Möglicherweise alt, aber das ist großartig. Ich wusste, dass so etwas existieren musste.

4voto

Vladislav Rastrusny Punkte 28645

Seltsame Lösung, aber...

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

0 Stimmen

Dies ist keine Lösung

4voto

JeanValjean Punkte 41

Die von mir vorgeschlagene Sequenz ermöglicht es 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 Sequenz von Ganzzahlen zwischen 15 (einschließlich) und 100 (ausschließlich).

Wenn dies ist, was Sie wollen, müssen Sie die beiden folgenden Ansichten erstellen, Ansichten, die Sie nur einmal deklarieren werden:

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+t.n*10+h.n*100 as value from digits as u cross join digits as t cross join digits as h;

Auf diese Weise haben Sie Ihre Sequenz mit einem intuitiven SELECT...

Hoffe, es hilft.

0 Stimmen

Verrückt! ... und es funktioniert. Ich brauchte etwas, das in einer Ansicht funktioniert - die Zuweisung in eine Variable ist für Ansichten blockiert. Gut.

2voto

Alistair Evans Punkte 34072

Angenommen, Sie wollen sie aus einer Tabelle abrufen, hier ist N 10, angenommen intcolumn ist die Spalte mit Zahlen darin.

SELECT intcolumn FROM numbers WHERE intcolumn > 0 LIMIT 10

Bearbeiten: Falls Sie tatsächlich die mathematische Menge der positiven Zahlen ohne Tabelle erhalten möchten, würde ich das überdenken, das kann intensiv sein (abhängig von der Implementierung). Die allgemein akzeptierte Praxis scheint darin zu bestehen, eine Lookup-Tabelle voller Zahlen zu erstellen und dann die obige Abfrage zu verwenden.

0 Stimmen

Ändern Sie einfach >= in >, um nur positive Werte zu erhalten.

0 Stimmen

Wird 0 als positiv oder negativ betrachtet?

0 Stimmen

Ich habe gerade nachgeschaut, anscheinend ist die Definition von positiven Zahlen größer als 0. Anscheinend ist Null das auch nicht (laut Wikipedia).

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