我有一個表,該表上的列包含一些記錄的空白空間。現在我需要將數據移動到另一個表,並用NULL
值替換空的空格。如何使用SQL Server將空格轉換爲空值?
我試着使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
,但它不工作。它會將所有col1
的值轉換爲NULL
。我只想將那些只有空格的值轉換爲NULL
。
我有一個表,該表上的列包含一些記錄的空白空間。現在我需要將數據移動到另一個表,並用NULL
值替換空的空格。如何使用SQL Server將空格轉換爲空值?
我試着使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
,但它不工作。它會將所有col1
的值轉換爲NULL
。我只想將那些只有空格的值轉換爲NULL
。
你試過這個嗎?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
正如評論者指出的那樣,你不必做ltrim()
或rtrim()
,並NULL
列將不匹配''
。
也許這樣?
UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
case語句從源表進行選擇時應該做的伎倆:
CASE
WHEN col1 = ' ' THEN NULL
ELSE col1
END col1
而且,有一點要注意的是,你的LTRIM和RTRIM從空間(」「)減少值空白( '')。如果您需要刪除空白,那麼case語句應進行適當修改:
CASE
WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
ELSE LTRIM(RTRIM(col1))
END col1
這裏有一個正則表達式一個雅。
update table
set col1=null
where col1 not like '%[a-z,0-9]%'
本質上找到任何不包含字母或數字的列,並將其設置爲空。可能必須更新,如果你有隻有特殊字符的列。
我想你已經回答了你自己的問題,爲什麼這是一個壞主意。 – MikeKulls 2012-07-06 03:19:56
SQL Server在比較字符串時忽略尾隨空格,所以''=''。只需使用下面的查詢爲您更新
UPDATE table
SET col1 = NULL
WHERE col1 = ''
NULL值在表中會留下空,並在空間與任意數量的col1s只有字符將被更改爲NULL。
如果你想從一個表的副本到另一個過程中做到這一點,使用:
INSERT INTO newtable (col1, othercolumn)
SELECT
NULLIF(col1, ''),
othercolumn
FROM table
我解決了使用NULLIF
功能類似的問題:
UPDATE table
SET col1 = NULLIF(col1, '')
如果兩個表達式不相等,則NULLIF返回第一個表達式。如果表達式相等,則NULLIF返回第一個表達式類型的空值。
此代碼生成一些SQL可在數據庫中每個表和列實現這一目標:
SELECT
'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL
WHERE [' + COLUMN_NAME + '] = '''''
FROM
INFORMATION_SCHEMA.columns C
INNER JOIN
INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA
WHERE
DATA_TYPE IN ('char','nchar','varchar','nvarchar')
AND C.IS_NULLABLE='YES'
AND T.TABLE_TYPE='BASE TABLE'
你甚至都不需要使用RTRIM。比較字符串時,SQL Server會忽略尾隨空格。 – 2010-09-20 00:47:12
@Bennor McCarthy:哇,我真的滑倒了...現在放下這個條款 – egrunin 2010-09-20 03:04:27
不是一個真正的主要問題。這不像性能或使用索引是真正關注的查詢。無論如何,你的回答仍然正確。 :) – 2010-09-20 03:18:54