2015-05-12 13 views
9

sagen, ich habe 3 Werte, Bill, Steve, Jack. und ich möchte nach dem Zufallsprinzip eine Tabelle mit diesen Werten aktualisieren, zBSQL Server 2012 Zufällige Zeichenfolge aus einer Liste

aktualisieren Kontakte gesetzt Vorname = (‚Bill‘, ‚Steve‘, ‚Jack‘), wo Stadt = ‚NY‘

wie kann ich diese Randomisierung Werte?

Dank

Antwort

13

Sie können dies mit folgendem 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 nur ein Dummy-Prädikat ist das SQL-Engine zwingt Unterabfrage für jede äußere Reihe zu nennen. Hier ist die Geige http://sqlfiddle.com/#!6/8ecca/22

+0

Ich versuche, es in eine Funktion zu machen und schrieb Frage auf http://StackOverflow.com/Questions/30332857/Function-ToRandomly-Select- a-value-from-a-list-sql-server-2012 jede Hilfe wäre willkommen. Vielen Dank – Bill

3

Sie können so etwas wie dieses

-- 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) erzeugen würde tun, um eine Zufallszahl von 1 bis 3 jedes Mal wenn Sie die Abfrage ausführen. Daher wählen Sie jedes Mal einen zufälligen Namen.

+1

Danke, immer den letzten Wert (zB Jack) für alle Zeilen erhalten. Gibt es eine Möglichkeit, es für verschiedene Zeilen in demselben Lauf zu randomisieren? – Bill

+0

Versuchen Sie diese https://StackOverflow.com/a/26188792/2343 – Sameer

7

Hier einige Liebe mit 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')