2015-12-21 22 views
9

SQL Server 2014 kullanıyorum ve yeni işlev CHOOSE ve RAND işlevlerinden yararlanmak istiyorum. Temelde listeden rastgele renk geri dönmek istiyorum. gibiRastgele değeri listeden döndürme

şey:

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 

mümkün mü?

+1

Evet ama RAND işlevi yanlış kullanıyorsunuz, argüman, maksimum değer değil tohumdur - RAND, 0 ile 1 –

+1

arasında bir sayı döndürdüğü için her zaman geri döner. Bu değerler neden bir tabloda değil? O zaman rastgele olanı almak çok mu önemsiz? –

cevap

7

Sen gelen tamsayılar almak için aşağıdaki RAND + ROUND kullanmak zorunda 1 Maksimum 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 

@GarethD aşağıdaki yorumladı gibi CEILING kullanabilirsiniz daha doğru olmak gerekirse:

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

Çalışıyor SQL-FIDDLE

+2

Bu, NULL değerini bir sıklıkta döndürür. –

+0

yep, -1 cevabınızı sınamak için -1 –

+0

@NickDewitt SQL Fiddle güncellendi. 28 yerine SQLFiddle içinde 'RAND() * 29' idi ... Daha önce fiddle güncellemeyi unuttunuz. –

4

Bunu deneyin

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 işlevi, maksimum rasgele değer değil, argüman olarak bir tohum değeri alır. Bu aralıkta rastgele bir sayı elde etmek için rastgele sayının sonucunu ihtiyaç duyduğunuz maksimum sayı ile çarpmanız gerekir.

Bunu test ettiğimde, önce rastgele değeri bir değişkene aktarmak zorunda kaldım ya da bazen boş döndü. Gareth D'nin yorumlarda da belirttiği gibi, fonksiyonun RAND() değerini değerlendirme yöntemi, her seferinde bir seçenek eşitlik açısından kontrol edildiğinde çağrılacaktır.

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" alabilmenizin sebebi, 'CHOOSE (RAND(),' A ',' B ') 'temelde' 'KADAR RAND() = 1' SONRA 'AÇILDIĞINDA DURUMDA' 'RENEN() = 2 SONRA 'B' END '. 'RAND()' iki kez değerlendirildiğinden, iki durumun da doğru olarak değerlendirilmemesi olasıdır, bu nedenle boş değer döndürülür. – GarethD

6

Bu yol bilmiyorum Bunu biliyor ve sana durumda bir daha çözüm vereceğini Sen söz etmedi:

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