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 при каждом запуске запроса. Таким образом, вы будете выбирать случайное имя каждый раз.
Ответ 4
Это может ответить на ваш вопрос:
Как создать случайное число для каждой строки в TSQL Выберите?
Используйте RAND для создания числа, которое определяет, какой из них использовать.
Ответ 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.