ビル、スティーブ、ジャックの3つの値があるとします。そして、私はそれらの値でランダムにテーブルを更新したいです、例えば
連絡先を更新して、firstname =( 'Bill'、 'Steve'、 'Jack')を設定します。city= 'NY'
これらの値をランダム化するにはどうすればよいですか?
ありがとう
次のトリックでこれを行うことができます:
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
これが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')
あなたはこのようなことをすることができます
_-- 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の乱数を生成します。したがって、毎回ランダムな名前を選択します。
これは、ベントゥルの回答を使用した追加の回答です。
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であるインスタンスがあります。