Как преобразовать пустые места в нулевые значения, используя SQL Server? - PullRequest
40 голосов
/ 13 сентября 2010

У меня есть таблица, и столбцы в этой таблице содержат пустые места для некоторых записей. Теперь мне нужно переместить данные в другую таблицу и заменить пустые места значением NULL.

Я пытался использовать:

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

но это не работает. Он преобразует все значения col1 в NULL. Я просто хочу преобразовать только те значения, которые имеют пробелы в NULL.

Ответы [ 7 ]

94 голосов
/ 05 октября 2012

Я решил похожую проблему, используя функцию NULLIF:

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

Из ссылки на T-SQL:

NULLIF возвращает первое выражениеесли два выражения не равны.Если выражения равны, NULLIF возвращает нулевое значение типа первого выражения.

40 голосов
/ 13 сентября 2010

Вы пробовали это?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

Как указывают комментаторы, вам не нужно вводить ltrim() или rtrim(), и NULL столбцы не будут совпадать с ''.

23 голосов
/ 20 сентября 2010

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

UPDATE table
SET col1 = NULL
WHERE col1 = ''

Значения NULL в вашей таблице останутся NULL, а столбцы с любым числом, содержащим только пробелы, будут заменены на NULL.чтобы сделать это во время копирования из одной таблицы в другую, используйте это:

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
12 голосов
/ 19 марта 2014

Этот код генерирует некоторый 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'
9 голосов
/ 13 сентября 2010

Оператор 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
7 голосов
/ 13 сентября 2010

Может как то так?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
0 голосов
/ 13 сентября 2010

вот регулярное выражение для тебя.

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

по существу находит все столбцы, в которых нет букв или цифр, и устанавливает его в ноль. возможно, придется обновить, если у вас есть столбцы с только специальными символами.

...