当[my_string]不包含字符串'NULL'时,TSQL替换([my_string],'NULL',NULL)仍返回NULL

时间:2018-03-27 22:53:13

标签: sql-server tsql

方案: 无论出于何种原因,您会发现一个包含字符“NULL”的列的表,但它们实际上应该包含一个真实的NULL。因此,您决定将“NULL”更新为NULL。即:

       IF OBJECT_ID('tempdb..#my_nulls') IS NOT NULL DROP TABLE #my_nulls;
   SELECT 1 as id
          ,'NULL' as my_column
     INTO #my_nulls
    UNION ALL
   SELECT 2 as id
          ,'to the man with a hammer' as my_column
    UNION ALL
   SELECT 3 as id
          ,'everything looks like a' as my_column
    UNION ALL
   SELECT 4 as id
          ,'NULL' as my_column
--------- -------------------------------------------------------------------------------------------------
   SELECT id
          ,my_column
          ,replace(my_column,'NULL',NULL)  as nullified
     FROM #my_nulls

这可能是令人惊讶的答案:

  id | my_column                | nullified
---- |------------------------- |-------------
   1 | NULL                     | NULL
   2 | to the man with a hammer | NULL
   3 | everything looks like a  | NULL
   4 | NULL                     | NULL

那么为什么当第2行和第3行显然不包含字符串'NULL'时将其转换为NULL 我想我知道答案,但我要问几个原因:

  1. 我很容易出错: - )
  2. 我无法在Stack Overflow上参考replace()看到这个具体问题/答案,
  3. 其他人可能也在摸不着头脑
  4. 我第一次没有正确阅读BOL!

1 个答案:

答案 0 :(得分:3)

所以我最终发现的是字符串转换为NULL的原因是NULL是一个未定义的值。你无法从无到有创造知识。 与NULL比较的任何内容都会返回NULL,而REPLACE函数也不例外。 BOL

  

“...如果任何一个参数为NULL,则返回NULL ....”

要解决此问题,我将REPLACE替换为NULLIF表达式。所以:

   SELECT id
          ,my_column
          ,nullif(my_column,'NULL')  as nullified
     FROM #my_nulls

返回:

  id | my_column                | nullified
-----|--------------------------|-------------------------
   1 | NULL                     | NULL
   2 | to the man with a hammer | to the man with a hammer
   3 | everything looks like a  | everything looks like a
   4 | NULL                     | NULL