web-dev-qa-db-ja.com

リストからのSQL Server 2012ランダム文字列

ビル、スティーブ、ジャックの3つの値があるとします。そして、私はそれらの値でランダムにテーブルを更新したいです、例えば

連絡先を更新して、firstname =( 'Bill'、 'Steve'、 'Jack')を設定します。city= 'NY'

これらの値をランダム化するにはどうすればよいですか?

ありがとう

16
Bill

次のトリックでこれを行うことができます:

update c set name=ca.name
from contacts c
outer apply(select top 1 name 
            from (values('bill'),('steve'),('jack')) n(name)
            where c.id = c.id order by newid())ca;

c.id = c.idは、SQLエンジンに各外部行のサブクエリを強制的に呼び出すダミーの述語です。これがフィドルです http://sqlfiddle.com/#!6/8ecca/22

22
Giorgi Nakeuri

これがchooseを使う愛です

with cte as (
   select *, (ABS(CHECKSUM(NewId())) % 3) + 1 as n
   from contacts
   where city = 'NY'
)
update cte
set firstname = choose(n, 'Bill','Steve','Jack')
8
Ben Thul

あなたはこのようなことをすることができます

_-- Storing the list of strings in a CTE

WITH PossibleValues AS 
( SELECT 'Bill' AS Name, 
          1 AS Number
  UNION SELECT 'Steve' AS NAME, 
         2 AS Number
  UNION SELECT 'Jack' AS NAME,
         3 AS Number
 )

UPDATE contacts
SET firstname = (SELECT Name
                          FROM PossibleValues
                          WHERE PossibleValues.Number = FLOOR(Rand()*(4-1)+1))
WHERE City = 'NY'
_

FLOOR(Rand()*(4-1)+1)は、クエリを実行するたびに1〜3の乱数を生成します。したがって、毎回ランダムな名前を選択します。

3
BICube

これはあなたの質問に答えるかもしれません:

TSQL Selectの各行に乱数を生成するにはどうすればよいですか?

Randを使用して、使用する番号を決定する数値を生成します。

0

これは、ベントゥルの回答を使用した追加の回答です。

DECLARE @index INT
SELECT  @index = CAST(Rand() * 3 + 1 AS INT)
UPDATE contacts SET firstname = CHOOSE(@index,'Bill','Steve','Jack') WHERE city = 'NY'

Rand関数を使用すると、1から3までのランダムな値になります。次に、結果のint値に基づいて、CHOOSE関数は、指定された文字列の順序/インデックスに応じて値を選択します。その場合、「Bill」はインデックス1で、以下同様です。

以下のSQLスクリプトを使用して、ランダムなint値をテストできます。

SELECT CAST(Rand() * 3 + 1 AS INT)

以下の例のように、Randを直接クエリに使用すると、奇妙な問題が発生します。

SELECT CHOOSE( CAST(Rand() * 3 + 1 AS INT),'Bill','Steve','Jack')

値がNULLであるインスタンスがあります。

0
Aries