Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Genera un valore int casuale da 3 a 6

Un utile editor ha aggiunto "Seleziona" prima di ogni istruzione, ma il punto di questo elemento è che può generare chiavi univoche per ogni riga in un ritorno, non solo un elemento (per questo vorrei utilizzare la funzione Rand()). Ad esempio :Seleziona i primi 100 Rand(),* da tblExample

Restituirebbe lo stesso valore casuale per tutte le 100 righe.

Mentre:Seleziona i primi 100 ABS(CHECKSUM(NEWID()) % 10),* da tblexample

Restituirebbe un valore casuale diverso compreso tra 0 e 9 su ogni riga nel ritorno. Quindi, mentre select rende più facile copiare e incollare, puoi copiare la logica in un'istruzione select se è ciò che è richiesto.

Questo genera un numero casuale compreso tra 0 e 9

SELECT ABS(CHECKSUM(NEWID()) % 10)

da 1 a 6

SELECT ABS(CHECKSUM(NEWID()) % 6) + 1

da 3 a 6

SELECT ABS(CHECKSUM(NEWID()) % 4) + 3

Dinamico (basato sul commento di Eilert Hjelmeseths, aggiornato per correggere i bug da (+ a -))

SELECT ABS(CHECKSUM(NEWID()) % (@max - @min - 1)) + @min

Aggiornato in base ai commenti:

  • NEWID genera una stringa casuale (per ogni riga in cambio)
  • CHECKSUM prende valore di stringa e crea numero
  • modulo (% ) divide per quel numero e restituisce il resto (il che significa che il valore massimo è uno in meno rispetto al numero che usi)
  • ABS cambia i risultati negativi in ​​positivi
  • quindi aggiungine uno al risultato per eliminare 0 risultati (per simulare un lancio di dadi)