SQL Server 2012 Случайная строка из списка

Скажем, у меня есть 3 значения, Билл, Стив, Джек. и я хочу случайным образом обновить таблицу с этими значениями, например

Обновить контакты set firstname = ('Bill', 'Steve', 'Jack'), где city = 'NY'

как я могу рандомизировать эти значения?

Спасибо

Ответ 1

Вы можете сделать это с помощью следующего трюка:

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

Ответ 2

Здесь некоторые любят использование 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')

Ответ 3

Вы можете сделать что-то вроде этого

-- 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 при каждом запуске запроса. Таким образом, вы будете выбирать случайное имя каждый раз.

Ответ 5

Это дополнительный ответ, используя ответ Бен Тул:

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 будет выбирать значения в зависимости от порядка/индекса заданных строк. В котором "Билл" - это индекс 1, то так далее.

Вы можете проверить случайные значения int, используя нижеприведенный SQL-скрипт:

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

У меня странная проблема, если использовать RAND непосредственно для запроса, например, ниже:

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

Есть экземпляр, значение которого равно NULL.