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

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

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

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

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

вопрос задан 13.09.2010
niceApp
940 репутация

7 ответов


  • 88 рейтинг

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

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

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

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

    ответ дан geca, с репутацией 1729, 5.10.2012
  • 36 рейтинг

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

    UPDATE table 
    SET col1 = NULL 
    WHERE col1 = ''
    

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

    ответ дан egrunin, с репутацией 20554, 13.09.2010
  • 21 рейтинг

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

    UPDATE table
    SET col1 = NULL
    WHERE col1 = ''
    

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

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

    INSERT INTO newtable ( col1, othercolumn )
    SELECT
       NULLIF(col1, ''),
       othercolumn
    FROM table
    
    ответ дан Bennor McCarthy, с репутацией 9016, 20.09.2010
  • 9 рейтинг

    Этот код генерирует некоторый 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'
    
    ответ дан gls123, с репутацией 4011, 19.03.2014
  • 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
    
    ответ дан craigh2, с репутацией 81, 13.09.2010
  • 6 рейтинг

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

    UPDATE [MyTable]
    SET [SomeField] = NULL
    WHERE [SomeField] is not NULL
    AND LEN(LTRIM(RTRIM([SomeField]))) = 0
    
    ответ дан does_not_exist, с репутацией , 13.09.2010
  • -1 рейтинг

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

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

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

    ответ дан DForck42, с репутацией 9660, 13.09.2010