Подтвердить что ты не робот

Как изменить все пустые строки на NULL в таблице?

У меня есть таблица устаревших таблиц со 100 столбцами (90% с нулевым значением). В этих 90 столбцах я хочу удалить все пустые строки и установить их в null. Я знаю, что могу:

update table set column = NULL where column = '';
update table set column2 = NULL where column2 = '';

Но это утомительно и подвержено ошибкам. Должен быть способ сделать это на всей таблице?

4b9b3361

Ответ 1

UPDATE
    TableName
SET
    column01 = CASE column01 WHEN '' THEN NULL ELSE column01 END,
    column02 = CASE column02 WHEN '' THEN NULL ELSE column02 END,
    column03 = CASE column03 WHEN '' THEN NULL ELSE column03 END,
    ...,
    column99 = CASE column99 WHEN '' THEN NULL ELSE column99 END

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

Изменить: добавлен END s

Ответ 2

Один из возможных script:

for col in $(echo "select column_name from information_schema.columns
where table_name='$TABLE'"|mysql --skip-column-names $DB)
do
echo update $TABLE set $col = NULL where $col = \'\'\;
done|mysql $DB

Ответ 3

Для новичков вам может потребоваться больше работы после просмотра вышеуказанных ответов. И это не так, чтобы напечатать тысячи строк. Поэтому здесь я предоставляю полный рабочий код, чтобы вы могли избежать синтаксических ошибок и т.д.

DROP PROCEDURE IF EXISTS processallcolumns;

DELIMITER $$

CREATE PROCEDURE processallcolumns ()
BEGIN

  DECLARE i,num_rows INT ;
  DECLARE col_name char(250);

  DECLARE col_names CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'PROCESSINGTABLE'
  ORDER BY ordinal_position;

  OPEN col_names ;
  select FOUND_ROWS() into num_rows;

  SET i = 1;
  the_loop: LOOP

     IF i > num_rows THEN
          CLOSE col_names;
          LEAVE the_loop;
      END IF;


      FETCH col_names 
      INTO col_name;     


      SET @command_text = CONCAT('UPDATE `PROCESSINGTABLE` SET ', col_name, '= IF(LENGTH(', col_name, ')=0, NULL,', col_name, ') WHERE 1 ;' ) ;

--      UPDATE `PROCESSINGTABLE` SET col_name=IF(LENGTH(col_name)=0,NULL,col_name) WHERE 1;
--      This won't work, because MySQL doesn't take varibles as column name.

      PREPARE stmt FROM @command_text ;
      EXECUTE stmt ;

      SET i = i + 1;  
  END LOOP the_loop ;



END$$
DELIMITER ;

call processallcolumns ();
DROP PROCEDURE processallcolumns;

Ответ 4

Существует не стандартный способ - но вы можете опросить системный каталог, чтобы получить соответствующие имена столбцов для соответствующей таблицы и сгенерировать SQL для этого. Вы также можете использовать выражение CASE для обработки всех столбцов за один проход - более крупный оператор SQL.

UPDATE Table
   SET Column1 = CASE Column1 = ' ' THEN NULL ELSE Column1 END,
       ...

Обратите внимание, что после создания большого оператора UPDATE вся работа выполняется на сервере. Это намного эффективнее, чем выбор данных для клиентского приложения, их изменение и запись результата в базу данных.

Ответ 5

Я думаю, вам нужно будет вытащить каждую строку на такой язык, как С#, php и т.д.

Что-то вроде:

rows = get-data()
foreach row in rows
    foreach col in row.cols
        if col == ''
            col = null
        end if
    next
next
save-data()

Ответ 6

Вы можете написать простую функцию и передать ей столбцы:

Использование:

SELECT
  fn_nullify_if_empty(PotentiallyEmptyString)
FROM
  table_name
;

Реализация:

DELIMITER $$
CREATE FUNCTION fn_nullify_if_empty(in_string VARCHAR(255))
  RETURNS VARCHAR(255)
  BEGIN
    IF in_string = ''
      THEN RETURN NULL;
      ELSE RETURN in_string;
    END IF;
  END $$
DELIMITER ;