2015-12-21 24 views
9

Sto utilizzando SQL Server 2014 e vorrei sfruttare la nuova funzione SCEGLI e RAND. Fondamentalmente mi piacerebbe restituire il colore casuale dalla lista.Restituisce il valore casuale dall'elenco

Qualcosa di simile:

Select CHOOSE(RAND(29), 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray', 
        'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle', 
        'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo', 
        'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon', 
        'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance', 
        'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour 

E 'possibile?

+1

Sì, ma si utilizza la funzione di RAND sbagliato, l'argomento è il seme non il valore massimo - questo restituirà sempre null poiché RAND restituisce un numero compreso tra 0 e 1 –

+1

Perché questi valori non sono in una tabella? Quindi è banale ottenere uno casuale? –

risposta

7

devi usare RAND + ROUND in seguito per ottenere interi da 1 fino a 29:

DECLARE @num INT = ROUND(RAND()*28,0) + 1 

SELECT CHOOSE(@num, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray', 
        'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle', 
        'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo', 
        'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon', 
        'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance', 
        'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Test 

Per essere più precisi è possibile utilizzare CEILING come @GarethD ha commentato in seguito:

DECLARE @num INT = CEILING(RAND()*29) 

Lavoro SQL-FIDDLE

+2

Restituisce NULL frequentemente come un valore. –

+0

sì, -1 per non testare la risposta –

+0

@NickDewitt ha aggiornato SQL Fiddle. Era 'RAND() * 29' in SQLFiddle invece di 28 ... Hai dimenticato di aggiornare il violino prima. –

4

Prova questo

Declare @RandVal INT 
SELECT @RandVal = ABS(Checksum(NewID()) % 29) + 1 
SELECT @RandVal 

Select CHOOSE(@RandVal, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray', 
        'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle', 
        'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo', 
        'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon', 
        'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance', 
        'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour 
4

La funzione RAND accetta un valore di inizializzazione come argomento, non il valore casuale massimo. È necessario moltiplicare il risultato del numero casuale per il massimo necessario per ottenere un numero casuale in tale intervallo.

Quando l'ho provato, dovevo passare prima il valore casuale in una variabile o solo a volte restituire null. Come accennato da Gareth D nei commenti, questo perché il modo in cui la funzione valuta RAND() viene chiamato una volta ogni volta che viene selezionata una scelta per l'uguaglianza.

DECLARE @counter smallint; 

SET @counter = (RAND()*28)+1; 

Select @counter, CHOOSE(@counter, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray', 
        'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle', 
        'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo', 
        'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon', 
        'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance', 
        'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour 
+1

Il motivo per cui si ottiene 'NULL' è che' CHOOSE (RAND(), 'A', 'B') 'è essenzialmente espanso a' CASE WHEN RAND() = 1 THEN 'A' WHEN RAND() = 2 THEN 'B' FINE'. Poiché 'RAND()' viene valutato due volte, è possibile che nessuna delle due condizioni valga su true, quindi viene restituito null. – GarethD

6

Lei non ha menzionato che lo sai e io vi darò ancora una soluzione nel caso in cui non si conosce in questo modo:

SELECT TOP 1 v FROM(VALUES('bg-blue'), ('bg-blue-madison'), ('bg-blue-hoki'))t(v) 
ORDER BY NEWID()