【问题标题】:SQL Server 2012 Random string from a listSQL Server 2012 列表中的随机字符串
【发布时间】:2015-07-23 20:55:43
【问题描述】:

假设我有 3 个值,Bill、Steve、Jack。我想用这些值随机更新一个表,例如

更新联系人集 firstname = ('Bill','Steve','Jack') where city = 'NY'

如何随机化这些值?

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案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 的随机数。因此,您每次都会选择一个随机名称。

      【讨论】:

      • 谢谢,继续获取所有行的最后一个值(例如 Jack)。有没有办法在同一运行中为不同的行随机化它?
      【解决方案4】:

      这是使用 Ben Thul 答案的附加答案:

      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的实例。

      【讨论】:

      • 您可以通过选择代码并单击{}按钮来更好地格式化它。
      【解决方案5】:

      这可能会回答你的问题:

      How do I generate random number for each row in a TSQL Select?

      使用 RAND 生成一个数字,以确定使用哪一个。

      【讨论】:

      • 我检查了链接,但不知道如何使用它,您是否建议我查询的语法?
      【解决方案6】:

      尝试了上述所有建议,最终索引到 ID 以在 CHOOSE 函数上生成随机索引

      select lastname, ,choose( ((ID % 3)+1),'Bill','John','Mac') as firstname from contacts
      

      其中“3”是列表中的项目数。 它不是真正随机的,因为它被索引到您的行 id,但它足够随机,所以每一行都是不同的。

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 1970-01-01
        • 2015-07-20
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多