方案:
无论出于何种原因,您会发现一个包含字符“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
我想我知道答案,但我要问几个原因:
replace()
看到这个具体问题/答案,答案 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