2015-12-21 9 views
9

Ich benutze SQL Server 2014, und möchte die neue Funktion wählen wählen und RAND. Grundsätzlich möchte man zufällige Farbe aus der Liste zurückgeben.Rückgabewert aus der Liste

Etwas wie:

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 

Ist es möglich?

+1

Ja, aber Sie verwenden die RAND-Funktion falsch, Das Argument ist der Startwert und nicht der Maximalwert. Dieser gibt immer null zurück, da RAND eine Zahl zwischen 0 und 1 zurückgibt. –

+1

Warum sind diese Werte nicht in einer Tabelle? Dann ist es trivial, einen zufälligen zu bekommen? –

Antwort

7

Sie haben RAND + ROUND in verwenden, folgende Zahlen bekommen von 1 bis zu 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 

Um genauer Sie CEILING als @GarethD kommentiert in folgenden verwenden:

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

Arbeiten SQL-FIDDLE

+2

Dies gibt NULL ungefähr so ​​häufig zurück wie ein Wert. –

+0

yep, -1 für nicht die Prüfung Ihrer Antwort –

+0

@NickDewitt aktualisiert SQL Fiddle. Es war 'RAND() * 29' in SQLFiddle statt 28 ... Vergessen, die Geige vorher zu aktualisieren. –

4

Versuchen Sie, diese

4

Die RAND-Funktion verwendet einen Startwert als Argument, nicht den maximalen Zufallswert. Sie müssen das Ergebnis der Zufallszahl mit dem Maximum multiplizieren, das Sie benötigen, um eine Zufallszahl in diesem Bereich zu erhalten.

Wenn ich das getestet habe, musste ich den zufälligen Wert zuerst in eine Variable übergeben oder er gab einfach mal null zurück. Wie von Gareth D in den Kommentaren erwähnt, liegt das daran, dass die Art, in der die Funktion RAND() ausgewertet wird, jedes Mal aufgerufen wird, wenn eine Auswahl auf Gleichheit geprüft wird.

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

Der Grund, warum Sie "NULL" erhalten können, ist, dass 'CHOOSE (RAND(), 'A', 'B') im Wesentlichen zu' CASE WHEN RAND() = 1 DANN 'A' WENN RAND() = 2 THEN erweitert wird "B" ENDE ". Da 'RAND()' zweimal ausgewertet wird, ist es möglich, dass keine der beiden Bedingungen als wahr ausgewertet wird, daher wird null zurückgegeben. – GarethD

6

Du hast nicht erwähnt, dass Sie das wissen und ich gebe Ihnen noch eine Lösung, falls Sie nicht wissen, auf diese Weise:

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