SELECT INTO OUTFILE (MySQL)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Null-waardes en \N

Bij het schrijven naar een bestand, substitueert MySQL lege velden met \N. De gebruikelijke oplossing lijkt te zijn om null-waardes te vervangen voor lege strings, met de functie IFNULL of COALESCE. De voorbeeldcode die ik zo snel tegenkwam, maakte gebruik van een cursor. Da's nou juist niet elegant als je SQL gebruikt. Plus dat ik het graag dynamisch wil, want soms heb ik met tabellen te maken met erg veel velden.

De oplossing: Een stored procedure met een prepared statement die de naam van een tabel als argument meekrijgt, met alle updates in één statement, zonder cursor, en waarbij de namen van de kolommen uit information_schema komen. Zo!

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `ExportFixNull`(in tblname tinytext)
BEGIN

set @string=concat(
    "Update ",@tblname," set ",
    (
        select group_concat(column_name,"=ifnull(",column_name,",'')")
        from information_schema.columns 
        where table_name=@tblname
    )
    ,";"
 );

prepare s1 from @string;
execute s1;
drop prepare s1;

END

Bronnen