2010-09-13 44 views
29

我有一個表,該表上的列包含一些記錄的空白空間。現在我需要將數據移動到另一個表,並用NULL值替換空的空格。如何使用SQL Server將空格轉換爲空值?

我試着使用:

REPLACE(ltrim(rtrim(col1)),' ',NULL) 

,但它不工作。它會將所有col1的值轉換爲NULL。我只想將那些只有空格的值轉換爲NULL

回答

32

你試過這個嗎?

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

正如評論者指出的那樣,你不必做ltrim()rtrim(),並NULL列將不匹配''

+4

你甚至都不需要使用RTRIM。比較字符串時,SQL Server會忽略尾隨空格。 – 2010-09-20 00:47:12

+0

@Bennor McCarthy:哇,我真的滑倒了...現在放下這個條款 – egrunin 2010-09-20 03:04:27

+0

不是一個真正的主要問題。這不像性能或使用索引是真正關注的查詢。無論如何,你的回答仍然正確。 :) – 2010-09-20 03:18:54

6

也許這樣?

UPDATE [MyTable] 
SET [SomeField] = NULL 
WHERE [SomeField] is not NULL 
AND LEN(LTRIM(RTRIM([SomeField]))) = 0 
8

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 
-1

這裏有一個正則表達式一個雅。

update table 
set col1=null 
where col1 not like '%[a-z,0-9]%' 

本質上找到任何不包含字母或數字的列,並將其設置爲空。可能必須更新,如果你有隻有特殊字符的列。

+2

我想你已經回答了你自己的問題,爲什麼這是一個壞主意。 – MikeKulls 2012-07-06 03:19:56

19

SQL Server在比較字符串時忽略尾隨空格,所以''=''。只需使用下面的查詢爲您更新

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

NULL值在表中會留下空,並在空間與任意數量的col1s只有字符將被更改爲NULL。

如果你想從一個表的副本到另一個過程中做到這一點,使用:

INSERT INTO newtable (col1, othercolumn) 
SELECT 
    NULLIF(col1, ''), 
    othercolumn 
FROM table 
+0

IMO這是最好的答案。這個問題問到如何在複製過程中將空字符串轉換爲空值。接受的答案不好,因爲它在2個步驟中執行,這不僅效率低下,而且阻止DBA添加約束以確保沒有空字符串。 – MikeKulls 2012-07-06 03:24:09

+0

我同意這裏的第二個查詢確實是最符合問題的答案,儘管我的答案是可以接受的答案。 – egrunin 2014-07-29 09:06:19

77

我解決了使用NULLIF功能類似的問題:

UPDATE table 
SET col1 = NULLIF(col1, '') 

From the T-SQL reference:

如果兩個表達式不相等,則NULLIF返回第一個表達式。如果表達式相等,則NULLIF返回第一個表達式類型的空值。

+0

http://technet.microsoft.com/en-us/library/ms177562.aspx – 2014-05-12 06:15:09

+3

這樣做的主要缺點是表中的所有行都將被更新,而不僅僅是需要更改的行。 – Trisped 2014-12-05 22:58:59

+1

@Trisped:當然,但對於那些希望在'INSERT'語句中執行類似操作的人來說,這是一個很好的選擇。 – Ellesedil 2015-02-19 19:19:08

7

此代碼生成一些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' 
+1

你的腳本很棒,你也可以加上: 'WHERE ['+ COLUMN_NAME +']'+'NOT LIKE'+'''%[az,0-9]%'''' – GeorgesC 2015-05-29 17:51:37

+0

謝謝,那是什麼正則表達式呢? – gls123 2015-08-17 09:03:21

相關問題