Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server 2012 Random string from a list

say I have 3 values, Bill, Steve, Jack. and I want to randomly update a table with those values, eg

Update contacts set firstname = ('Bill','Steve','Jack') where city = 'NY'

how do I randomize these values?

Thanks

like image 260
Bill Avatar asked May 12 '15 19:05

Bill


4 Answers

You can do this with the following trick:

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 is just a dummy predicate that forces sql engine to call subquery for each outer row. Here is the fiddle http://sqlfiddle.com/#!6/8ecca/22

like image 66
Giorgi Nakeuri Avatar answered Oct 20 '22 23:10

Giorgi Nakeuri


Here's some love using 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')
like image 36
Ben Thul Avatar answered Oct 20 '22 23:10

Ben Thul


You can do something like this

-- 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'

The FLOOR(RAND()*(4-1)+1) would generate a random number from 1 to 3 everytime you run the query. Therefore, you will be picking a random name every time.

like image 41
BICube Avatar answered Oct 20 '22 23:10

BICube


This is addition answer using Ben Thul answer:

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

Using RAND function will random values from 1 to 3. Then, based on resulted int value the CHOOSE function will pick values depending on the order/index of the given strings. In which 'Bill' is the index 1 then so on.

You can test the random int values by using below SQL script:

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

I have a weird issue if use the RAND directly to the query for example below:

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

There are instance that value is NULL.

like image 39
Aries Avatar answered Oct 21 '22 00:10

Aries