Sql-Server

用提供的列表中的一個字元串替換 NULL 值

  • November 24, 2017

我試圖通過使用 SELECT 與我提供給編譯器的集合中的一個(隨機?)字元串來替換錶中的 NULL 值。

例子:

|id | date |
+---+------+    
| 1 | 2017 |
| 2 | NULL |
| 3 | NULL |

我希望這些NULL值是“2015”、“2012”等,從我指定的集合中隨機獲取。

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

IF column_value = 'NULL (or something)' THEN RAND(string1, string2, string3, string4).

提前致謝。

你可以使用類似的東西

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

Id中的引用ORDER BY只是為了使其相關,以便 SQL Server 不太可能假離線結果並將其重放多行。為此選擇一個唯一的列。

順便說一句:有一個CHOOSE函式看起來很誘人,但是當它擴展到CASE隨機數時,函式也會被複製出來,因此不適合該任務。

不要使用這個

SELECT Id,
      CHOOSE(1 + ABS(CRYPT_GEN_RANDOM(4) % 2),2015,2012)
FROM   YourTable 

因為它被評估為

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 

(並且CASE ABS(CRYPT_GEN_RANDOM(4) % 2) WHEN 0 THEN 2012 WHEN 1 THEN 2015 END會有同樣的問題)

引用自:https://dba.stackexchange.com/questions/191621