Ответ 1
Вы пробовали это?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
Как отмечают комментаторы, вам не нужно делать ltrim()
или rtrim()
, а столбцы NULL
не соответствуют ''
.
У меня есть таблица, и столбцы в этой таблице содержат пустые пространства для некоторых записей. Теперь мне нужно переместить данные в другую таблицу и заменить пустые пространства значением NULL
.
Я попытался использовать:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
но это не сработает. Он преобразует все значения col1
в NULL
. Я просто хочу преобразовать только те значения, которые имеют пустые пространства до NULL
.
Вы пробовали это?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
Как отмечают комментаторы, вам не нужно делать ltrim()
или rtrim()
, а столбцы NULL
не соответствуют ''
.
Я решил аналогичную проблему, используя функцию NULLIF
:
UPDATE table
SET col1 = NULLIF(col1, '')
NULLIF возвращает первое выражение, если два выражения не равны. Если выражения равны, NULLIF возвращает нулевое значение типа первого выражения.
SQL Server игнорирует конечные пробелы при сравнении строк, поэтому '' = ''. Просто используйте следующий запрос для обновления
UPDATE table
SET col1 = NULL
WHERE col1 = ''
Значения NULL в вашей таблице останутся NULL, а col1s с любым числом на пробеле только символы будут изменены на NULL.
Если вы хотите сделать это во время копирования из одной таблицы в другую, используйте это:
INSERT INTO newtable ( col1, othercolumn )
SELECT
NULLIF(col1, ''),
othercolumn
FROM table
Оператор 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
Этот код генерирует некоторый 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'
Может быть, что-то вроде этого?
UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
здесь регулярное выражение для ya.
update table
set col1=null
where col1 not like '%[a-z,0-9]%'
по существу находит любые столбцы, которые не имеют в них букв или цифр, и устанавливает его в null. возможно, придется обновлять, если у вас есть столбцы с только специальными символами.