如何在表中将所有空字符串更改为NULL?

时间:2010-07-13 14:45:29

标签: mysql sql string sql-update

我有一个包含大约100列(90%可空)的遗留表。在这90个列中,我想删除所有空字符串并将它们设置为null。我知道我可以:

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

但这很乏味且容易出错。在整个桌子上必须有一种方法吗?

7 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:11)

一个可能的脚本:

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

答案 2 :(得分:6)

对于新手,在看到上述答案后,您可能仍需要更多工作。输入数千行是不现实的。 所以在这里我提供了一个完整的工作代码,以避免语法错误等。

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;

答案 3 :(得分:1)

没有标准方法 - 但您可以查询系统目录以获取相关表的相关列名,并生成SQL来执行此操作。您也可以使用CASE表达式来处理单个传递中的所有列 - 更大的SQL语句。

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

请注意,一旦生成了大UPDATE语句,所有工作都在服务器中完成。这比为客户端应用程序选择数据,在那里更改数据以及将结果写回数据库更有效。

答案 4 :(得分:0)

我认为你需要将每一行拉成C#,php等语言。

类似的东西:

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

答案 5 :(得分:0)

您可以编写一个简单的函数并将其列传递给它:

用法:

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 ;

答案 6 :(得分:0)

Hammerite's answer很好,但是您也可以将CASE替换为IF

UPDATE
    TableName
SET
    column01 = IF(column01 = '', NULL, column01),
    column02 = IF(column02 = '', NULL, column02),
    column03 = IF(column03 = '', NULL, column03),
    ...,
    column99 = IF(column99 = '', NULL, column99)