Integer-Intervall in MySQL erzeugen

Mit einem kleinen Trick aus dem Relationen-Kalkül lassen sich in einem MySQL-RDBMS eine Sequenz bzw ein Intervall aus Integer Zahlen erzeugen.

Zur Erzeugung von zufälligen Integer-Indizes, die jedoch breits verwendete/besetzte nicht enthalten, musste eine Liste aus Integer-Zahlen erzeugt werden. Aus dieser Sequenz wird durch simples anhängen von order by rand (siehe Beispiele zur Funktion RAND()) Zufallszahlen. Jedoch sind sequenzielle Arbeiten in der Welt der relationalen Datenbanken nicht immer einfach zu bewältigen.

In MySQL bietet es sich an hierzu eine Variable zu verwenden, die bei jeder Zeile inkrementiert wird. Bleibt nur noch das Problem eine definierte Menge an Zeilen zu erzeugen. Die Ziffern von 0-9 erhält man durch folgene Abfrage:

select 0 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;

Dieses Spiel könnte man nun bis zur gewünschten Anzahl an Zeilen so weiter treiben. Jedoch ist dies wohl kaum im Sinne des Erfinders. Es bietet sich deshalb an, durch einen natürlichen Verbund bzw. natural join aus zwei Ziffern-Sequenzen von 0-9 alle möglichen 100 Kombinationen zu erzeugen:

select *
from
( select 0 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 t0,
( select 0 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 t1

Damit sind wir schon fast am Ziel. Wir fügen noch ein paar Zehnerpotenzen zu unserer Zahlenfolge hinzu und definieren eine SQL-Variable, die inkrementiert werden soll. Èt voilá:

select
  @i := @i + 1 as number
from
  (select 0 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 t0,
  (select 0 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 t1,
  (select 0 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 t2,
  (select 0 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 t3,
  (select 0 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 t4,
  (select @i:=0) as t_init;

Durch anhängen einer Limit-Klausel an eine einhüllende Select-Abfrage erhält man falls gewünscht ein Intervall. Mit dieser Fähigkeit Zahlenfolgen zu erzeugen, stehen Möglichkeiten offen, zahlreiche kombinatorische Probleme in der Datenbank mit einem Mengen-basierten Ansatz zu lösen.