buq’s blog

覚えておきたいけど覚えておけなさそうなことを書きます?

NULL と陽に書いていない空なカラムを NULL として取り込ませる @ mysql

会社の人に mysqlcsvを読み込むとき,NULL と陽に書いていない空なカラムを NULL として取り込ませる方法を教えて貰った.メモ.

drop table if exists foo;                                                                                                               
create table foo (                                                                                                                      
  a INTEGER default null,                                                                                                               
  b INTEGER default null                                                                                                                
);                                                                                                                                      
                                                                                                                                        
LOAD DATA LOCAL INFILE 'dat.csv'                                                                                                        
-- <dat.csv>                                                                                                                            
-- 1,2                                                                                                                                  
-- 3,                                                                                                                                   
-- ,4                                                                                                                                   
-- ,                                                                                                                                    
-- </dat.csv>                                                                                                                           
INTO TABLE foo                                                                                                                          
FIELDS TERMINATED BY ','                                                                                                                
(a, @b_raw)                                                                                                                             
set b = case @b_raw when '' then NULL else @b_raw end;                                                                                  
                                                                                                                                        
select * from foo;                                                                                                                      

カラム b は一度生データを b_raw という変数で受けて,これが空文字列なら b に NULL をセットするようにしている.a は何も処理していない.

結果:

+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 | NULL |
|    0 |    4 |
|    0 | NULL |
+------+------+

🎉