Как преобразовать пустые пространства в нулевые значения с помощью SQL Server?

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

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

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

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


person niceApp    schedule 13.09.2010    source источник


Ответы (7)


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

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

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

person egrunin    schedule 13.09.2010
comment
Вам даже не нужно использовать RTRIM. SQL Server игнорирует конечные пробелы при сравнении строк. - person Bennor McCarthy; 20.09.2010
comment
@Bennor McCarthy: вау, я действительно сбиваюсь с толку...сейчас я уберу этот пункт - person egrunin; 20.09.2010
comment
Не очень большая проблема. Не похоже, чтобы производительность или использование индексов действительно беспокоили запрос. Ваш ответ все равно был правильным. :) - person Bennor McCarthy; 20.09.2010
comment
Это не удастся, если в таблице есть ограничение, запрещающее пустые строки (что является хорошей идеей, если вы используете только нули). Лучше удалить пустые строки во время копирования с помощью функции NULLIF. - person MikeKulls; 06.07.2012
comment
@MikeKulls: он, кажется, подразумевает, что у таблицы нет таких ограничений. Лично я всегда стараюсь избегать NULL в записях данных, потому что тогда программная логика должна следить за ними. - person egrunin; 06.07.2012
comment
@egrunin: В любом случае, вы должны иметь ограничение, чтобы гарантировать, что вы последовательны. Он использует NULL в этой таблице, поэтому должен иметь ограничение, чтобы ничто не было пустой строкой. Даже если он этого не делает в настоящее время, есть шанс, что это может быть добавлено в будущем, но только если это будет сделано во время копирования. В любом случае это более простой и быстрый способ сделать это, потому что он выполняется за один шаг. - person MikeKulls; 09.07.2012

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

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

Из справочника по T-SQL:

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

person geca    schedule 05.10.2012
comment
Основным недостатком этого является то, что будут обновлены все строки в таблице, а не только строки, которые требуют изменения. - person Trisped; 06.12.2014
comment
Это хороший вариант, если вы также делаете другие обновления в столбце, когда есть непустая строка или если вы используете ее в операторе INSERT - person tim; 02.02.2021

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

UPDATE table
SET col1 = NULL
WHERE col1 = ''

Значения NULL в вашей таблице останутся NULL, а столбцы col1 с любым числом символов в пробеле будут изменены на NULL.

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

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
person Bennor McCarthy    schedule 20.09.2010
comment
ИМО это лучший ответ. Вопрос задавался, как преобразовать пустые строки в нуль во время копирования. Принятый ответ нехорош, потому что он делает это за 2 шага, что не только менее эффективно, но и не позволяет администратору баз данных добавлять ограничение, чтобы гарантировать отсутствие пустых строк. - person MikeKulls; 06.07.2012
comment
Я согласен с тем, что второй запрос здесь действительно является ответом, который лучше всего соответствует вопросу, хотя мой ответ был принятым. - person egrunin; 29.07.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'
person gls123    schedule 19.03.2014
comment
ваш сценарий великолепен, также вы можете добавить: ` ГДЕ [' + COLUMN_NAME + '] ' + 'NOT LIKE ' + '''%[a-z,0-9]%''' ` - person GeorgesC; 29.05.2015
comment
Спасибо, что делает это регулярное выражение? - person gls123; 17.08.2015

Оператор 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
person craigh2    schedule 13.09.2010

Может быть, что-то вроде этого?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
person Community    schedule 13.09.2010

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

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

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

person DForck42    schedule 13.09.2010
comment
Я думаю, вы сами ответили на свой вопрос, почему это плохая идея. - person MikeKulls; 06.07.2012