2004-03-12, 15:48
welches DBMS?
leider sind die Random-Funktionen der DBMSs relativ schlecht. Rainer hatte mit dem SQL-Server da auch nicht so gute Erfahrungen gemacht. Beim alten MySQL hat das auch ziemlich gesponnen. Beim 4er sollte es angeblich besser sein.
Grundsätzlich hat ja SQL keine Random-Funktion. Das sind alles proprietäre Erweiterungen des DBMS.
Ihr verwendet vermutlich Oracle, oder? Oder a SAP-DBMS? Kenn mich da net so aus.
Wenn's irgendwie geht, mach's eher im Programmcode und nicht auf der DB - ist jedenfalls einfacher.
Ausserdem ist "laufenden, zufälligen SQL-Wert" net grad sehr verständlich. Sorry, dass ich jetzt obergscheit klinge, aber entweder er ist fortlaufend - also ein Zähler, oder er ist zufällig. Wenn er eindeutig sein soll, dann kann er nicht zufällig sein. Und was meinst du mit "SQL-Wert". Das ganze soll in der DB-Ablaufen? Stored Procedure oder SELECT-Statement, oder?
sonst sowas wie:
<pre>
initialisiere Zufallszahlengenerator;
str = "";
for(i = 0; i < 4 i++)
{
j = rnd(36); // erzeugt Zufallszahlen von 0 bis 35
if(j < 10)
str = str + chr(j + 48);
else
str = str + chr(j - 10 + 65)
}
</pre>
muss man natürlich an die jeweilege Prog-Sprache anpassen.
was auch gehen würde: Zufallszahl generieren (möglichst großer Bereich, dann einen hash davon berechnen (md5-Funktion z.B.) und davon dann die ersten 4 Ziffern verwenden:
in PHP z.B.:
str = substr(md5(rand()), 0, 4);
Kommt halt auf die Eigenschaften an, die der Code haben soll.
Wenn du das ganze in einem Select/Insert/Update brauchst, dann geht vermutlich keine Schleife - einfach 4 mal hintereinander denselben Code. Eventuell ohne If und dafür vorher einen String definieren:
z.B. für SQL-Server (ohne es getestet zu haben.)
<pre>
DECLARE strChars VARCHAR(255)
SET strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SELECT SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1)
</pre>
geht natürlich auch in am Insert oder Update.
Achtung: Randbedingungen beim SUBSTRING und ROUND hab ich nicht gecheckt.
Nachtrag: Ich glaub das mit den Problemen bei Zufallszahlen und den DBMS ist bei deinem Fall kein Problem. Bei uns war das jeweils das Problem, dass wir zufällig Zeilen aus einer Tabelle auswählen wollten. D.h. man muss beim ORDER BY eine Zufallszahl verwenden. Und da haben/hatten die DBMS Probleme. Sprich die Zeilen die da rausgekommen sind, waren meist überhaupt nicht zufällig. Hatte das Problem z.B. bei der Fußzeile hier im Forum: Wollte, dass unter "Besucht auch unsere Sponsoren:" unsere größten Sponsoren zufällig sortiert erscheinen. Gewichtet nach dem was sie zahlen.
Aufpassen musst natürlich bei den Initialisierungswerten der Zufallszahlengeneratoren. Ist aber auch immer ein Implementierungsdetail, also net unbedingt allgemeingültig.
leider sind die Random-Funktionen der DBMSs relativ schlecht. Rainer hatte mit dem SQL-Server da auch nicht so gute Erfahrungen gemacht. Beim alten MySQL hat das auch ziemlich gesponnen. Beim 4er sollte es angeblich besser sein.
Grundsätzlich hat ja SQL keine Random-Funktion. Das sind alles proprietäre Erweiterungen des DBMS.
Ihr verwendet vermutlich Oracle, oder? Oder a SAP-DBMS? Kenn mich da net so aus.
Wenn's irgendwie geht, mach's eher im Programmcode und nicht auf der DB - ist jedenfalls einfacher.
Ausserdem ist "laufenden, zufälligen SQL-Wert" net grad sehr verständlich. Sorry, dass ich jetzt obergscheit klinge, aber entweder er ist fortlaufend - also ein Zähler, oder er ist zufällig. Wenn er eindeutig sein soll, dann kann er nicht zufällig sein. Und was meinst du mit "SQL-Wert". Das ganze soll in der DB-Ablaufen? Stored Procedure oder SELECT-Statement, oder?
sonst sowas wie:
<pre>
initialisiere Zufallszahlengenerator;
str = "";
for(i = 0; i < 4 i++)
{
j = rnd(36); // erzeugt Zufallszahlen von 0 bis 35
if(j < 10)
str = str + chr(j + 48);
else
str = str + chr(j - 10 + 65)
}
</pre>
muss man natürlich an die jeweilege Prog-Sprache anpassen.
was auch gehen würde: Zufallszahl generieren (möglichst großer Bereich, dann einen hash davon berechnen (md5-Funktion z.B.) und davon dann die ersten 4 Ziffern verwenden:
in PHP z.B.:
str = substr(md5(rand()), 0, 4);
Kommt halt auf die Eigenschaften an, die der Code haben soll.
Wenn du das ganze in einem Select/Insert/Update brauchst, dann geht vermutlich keine Schleife - einfach 4 mal hintereinander denselben Code. Eventuell ohne If und dafür vorher einen String definieren:
z.B. für SQL-Server (ohne es getestet zu haben.)
<pre>
DECLARE strChars VARCHAR(255)
SET strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SELECT SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1)
</pre>
geht natürlich auch in am Insert oder Update.
Achtung: Randbedingungen beim SUBSTRING und ROUND hab ich nicht gecheckt.
Nachtrag: Ich glaub das mit den Problemen bei Zufallszahlen und den DBMS ist bei deinem Fall kein Problem. Bei uns war das jeweils das Problem, dass wir zufällig Zeilen aus einer Tabelle auswählen wollten. D.h. man muss beim ORDER BY eine Zufallszahl verwenden. Und da haben/hatten die DBMS Probleme. Sprich die Zeilen die da rausgekommen sind, waren meist überhaupt nicht zufällig. Hatte das Problem z.B. bei der Fußzeile hier im Forum: Wollte, dass unter "Besucht auch unsere Sponsoren:" unsere größten Sponsoren zufällig sortiert erscheinen. Gewichtet nach dem was sie zahlen.
Aufpassen musst natürlich bei den Initialisierungswerten der Zufallszahlengeneratoren. Ist aber auch immer ein Implementierungsdetail, also net unbedingt allgemeingültig.