2010-09-13 4 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 игнорирует конечные пробелы при сравнении строк. –

+0

@Bennor McCarthy: ничего себе, я действительно сползаю ... собираюсь снять эту статью сейчас – egrunin

+0

Не очень серьезная проблема. Это не так, как производительность или использование индексов действительно вызывает озабоченность по поводу запроса. В любом случае, ваш ответ все равно был прав. :) –

6

Возможно, что-то вроде этого?

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

Заявление дело должно сделать трюк при выборе из вашей исходной таблицы:

CASE 
    WHEN col1 = ' ' THEN NULL 
    ELSE col1 
END col1 

Кроме того, одна вещь, чтобы отметить, что ваш LTRIM и RTRIM уменьшить значение из пространства (»«) для заготовки (''). Если вам нужно удалить пустое пространство, то в случае заявление должно быть изменено соответствующим образом:

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

19

SQL Server игнорирует конечные пробелы при сравнении строк, поэтому '' = ''. Просто используйте следующий запрос для обновления

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

NULL значения в таблице будет находиться NULL, и col1s с любым числом на пространстве только символы будут заменены на NULL.

Если вы хотите сделать это во время вашей копии из одной таблицы в другую, используйте:

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

IMO это лучший ответ. Вопрос задан как преобразовать пустые строки в нуль во время копирования. Принятый ответ не является хорошим, потому что он делает это за 2 шага, который не только менее эффективен, но и останавливает администратор базы данных, добавляя ограничение, чтобы убедиться, что нет пустых строк. – MikeKulls

+0

Я согласен с тем, что второй запрос действительно является ответом, который наилучшим образом соответствует этому вопросу, хотя мой ответ был принят. – egrunin

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 –

+3

Основным недостатком этого является то, что все строки в таблице будут обновляться, а не только строки, которые нуждаются в изменении. – Trisped

+1

@Trisped: Конечно, но это отличный вариант для тех из нас, кто ищет что-то подобное в инструкции 'INSERT'. – Ellesedil

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

+0

Спасибо, что это regex do? – gls123