Pour les débutants, vous pouvez encore avoir besoin de plus de travail après avoir vu les réponses ci-dessus. Et ce n'est pas réaliste de taper des milliers de lignes. Donc ici, je fournir un code de travail complet pour vous permettre d'éviter les erreurs de syntaxe, etc.
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;
Est-ce une affaire one-shot ou sera ce besoin d'être maintenu? –
one-shot, serait prob. exécutez-le un autre moment aussi bien. –
J'allais suggérer que, s'il y a un risque que des chaînes de longueur zéro trouvent leur chemin dans la table, vous pourriez créer une vue dans laquelle les chaînes de longueur zéro sont converties en valeurs NULL. De cette façon, vos applications n'auront jamais à se soucier d'eux. –