Per i neofiti, si può ancora bisogno più lavoro dopo aver visto le risposte di cui sopra. E non è realistico digitare migliaia di righe. Così qui ho fornire un codice di lavoro completo per permettere di evitare errori di sintassi, ecc
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;
fonte
2012-10-31 04:19:02
È questo un affare one-shot o sarà questa necessità di essere sempre? –
one-shot, sarebbe prob. eseguirlo anche un'altra volta. –
Stavo per suggerire che, se c'è il pericolo che le stringhe di lunghezza zero trovino nuovamente la loro strada nella tabella, è possibile creare una vista in cui le stringhe di lunghezza zero vengono convertite in valori NULL. In questo modo le tue applicazioni non dovrebbero mai preoccuparsi di loro. –