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.