Kyl*_*est 16 mysql sql string sql-update
我有一个约100列(90%可空)的遗留表.在这90个列中,我想删除所有空字符串并将它们设置为null.我知道我可以:
update table set column = NULL where column = '';
update table set column2 = NULL where column2 = '';
Run Code Online (Sandbox Code Playgroud)
但这很乏味且容易出错.在整个桌子上必须有一种方法吗?
Ham*_*ite 38
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
Run Code Online (Sandbox Code Playgroud)
这仍然是手动完成的,但比你的痛苦略少,因为它不需要你为每一列发送查询.除非你想要编写脚本的麻烦,否则在做这样的事情时你将不得不忍受一定的痛苦.
编辑:添加了ENDs
Mat*_*hen 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
Run Code Online (Sandbox Code Playgroud)
对于新手,在看到上述答案后,您可能仍需要更多工作.输入数千行是不现实的.所以在这里我提供了一个完整的工作代码,以避免语法错误等.
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;
Run Code Online (Sandbox Code Playgroud)