2015-12-21 6 views
9

私はSQL Server 2014を使用しています。新しい機能CHOOSEとRANDを利用したいと考えています。基本的には、リストからランダムな色を返すことを望みます。以下のようなリストからランダムな値を返します

何か:

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 

それは可能ですか?

+1

はいていますがRAND関数が間違っを使用しています引数は最大値ではないシードです - これはRANDが0と1の間の数値を返すので常にnullを返します –

+1

これらの値がテーブルにないのはなぜですか?それでは、ランダムなものを得るのは簡単ですか? –

答えて

7

あなたは29まで1から整数を取得するには、以下にRAND + ROUNDを使用する必要があります。

DECLARE @num INT = CEILING(RAND()*29) 
を:@GarethDは、以下にコメントとしてお CEILINGを使用することができます

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 

、より正確には

動作SQL-FIDDLE

+2

これは、値ほど頻繁にNULLを返します。 –

+0

あなたの答えをテストしていないのですが、 –

+0

@NickDewittはSQL Fiddleを更新しました。それは28の代わりにSQLFiddleの 'RAND()* 29'でした...前にフィドルを更新するのを忘れました。 –

4

お試しください

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

RAND関数は、乱数の最大値ではなく、引数としてシード値をとります。その範囲の乱数を得るためには、乱数の結果に必要な最大値を掛ける必要があります。

私がこれをテストしたとき、最初に変数にランダム値を渡すか、時にはnullを返すだけでした。 Gareth Dがコメントで述べたように、これは、関数がRAND()を評価する方法は、選択肢が等しいかどうかがチェックされるたびに1回呼び出されるためです。

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

'NULL 'を得ることができる理由は、' RAND()、' A '、' B ') 'が本質的に' RAND()= 1のときは 'A' 'B' END'。 'RAND()'は2回評価されるため、どちらの条件もtrueと評価されない可能性があるため、nullが返されます。 – GarethD

6

あなたはこのことを知っていることを言及しなかったし、私はあなたがこの方法を知らない場合の1つの以上のソリューションを提供します:、

SELECT TOP 1 v FROM(VALUES('bg-blue'), ('bg-blue-madison'), ('bg-blue-hoki'))t(v) 
ORDER BY NEWID() 
関連する問題