用提供的列表中的一个字符串替换 NULL 值

Lak*_*ake 5 null sql-server ssms t-sql

我试图通过使用 SELECT 和我提供给编译器的集合中的一个(随机?)字符串来替换表中的 NULL 值。

例子:

|id | date |
+---+------+    
| 1 | 2017 |
| 2 | NULL |
| 3 | NULL |
Run Code Online (Sandbox Code Playgroud)

我希望NULL值是“2015”、“2012”等,从我指定的集合中随机获取。

不幸的是,COALESCE只返回第一个非空值,而不是指定的值。是否有一些功能,如:

IF column_value = 'NULL (or something)' THEN RAND(string1, string2, string3, string4).
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Mar*_*ith 7

你可以使用类似的东西

SELECT Id,
       ISNULL(Date, (SELECT TOP 1 *
                     FROM   (VALUES(2015),
                                   (2012)) R(Ryear)
                     ORDER  BY CRYPT_GEN_RANDOM(DATALENGTH(Id))))
FROM   YourTable 
Run Code Online (Sandbox Code Playgroud)

到参考IdORDER BY是只是为了让相关以便SQL Server是不太可能阀芯结果和重放它多行。为此选择一个唯一的列。

顺便说一句:有一个CHOOSE函数看起来很诱人,但是当它扩展到CASE随机数函数时也会被复制出来,所以这不适合这项任务。

不要用这个

SELECT Id,
       CHOOSE(1 + ABS(CRYPT_GEN_RANDOM(4) % 2),2015,2012)
FROM   YourTable 
Run Code Online (Sandbox Code Playgroud)

因为它被评估为

CASE
  WHEN (1 + ABS(CRYPT_GEN_RANDOM(4) % 2)) = 1
    THEN 2015
  ELSE
    CASE
      WHEN (1 + ABS(CRYPT_GEN_RANDOM(4) % 2)) = 2
        THEN 2012
      ELSE NULL
    END
END 
Run Code Online (Sandbox Code Playgroud)

(并且CASE ABS(CRYPT_GEN_RANDOM(4) % 2) WHEN 0 THEN 2012 WHEN 1 THEN 2015 END会有同样的问题)