2017-12-13 6 views
0

.csv 파일의 데이터를 내 db로로드하려고합니다. 문제는 "maxSpieler"의 숫자가 문자열로 저장되었지만 int로 저장하려고합니다. 일종의 스크립트를 사용하여 .csv 파일의 값을 변경할 수는 있지만 SQL을 사용하여이 값에 접근하고 싶습니다.스위치 케이스를 사용하여 SQL에서 .csv의 값을 변경하는 방법

LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE spiele 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(ID_Spiel, name,dauer,@var,@datum,hersteller_id) 
SET maxSpieler = 
    CASE 
     WHEN @var = "Eins" THEN maxSpieler = 1 
     WHEN @var = "Zwei" THEN maxSpieler = 2 
     WHEN @var = "Drei" THEN maxSpieler = 3 
     WHEN @var = "Vier" THEN maxSpieler = 4 
     WHEN @var = "Fünf" THEN maxSpieler = 5 
     WHEN @var = "Sechs" THEN maxSpieler = 6 
    END 
WHERE maxSpieler IN ('Eins', 'Zwei', 'Drei', 'Vier', 'Fünf', 'Sechs') 
SET erscheinungsdatum = STR_TO_DATE(@datum,'%d.%m.%Y') 

.csv 파일 :

ID;Name;Dauer in Minuten;Anzahl Spieler;Erscheinungsdatum;Hersteller_ID 
1;Reversi;30;Fünf;01.12.1893;3 
2;Vier gewinnt;10;Zwei;31.07.1974;1 
3;HeroQuest ;90;Fünf;01.05.1989;1 
4;Das verrueckte Labyrinth;30;Vier;31.12.1986; 
5;Dominion ;40;Vier;01.01.2008; 
6;Mensch ärgere dich nicht;30;Vier;01.01.1910;4 
7;;20;Sechs;08.06.1995;5 
8;Spiel des Lebens;60;Sechs;01.01.1980;1 
9;;10;Zwei;31.12.1970;2 
10;King Arthur;60;Vier;31.10.2003;3 
여기에 내가 지금까지 뭘하려은 "문제는"라인에서 시작

부하 데이터 쿼리에 대한 나의 접근 방식 "maxSpieler = 설정"

내 테이블 구조는 : enter image description here

는 그것을 써머하려면 내가 필요 문자열 인 내 .csv 파일에서 maxSpieler의 값을 int로 변경하고 내 데이터베이스에 저장합니다.

+0

당신은 다음과 TEMPTABLE를 업데이트 VARCHAR와 같은 임시 테이블에 저장 할 수 있습니다 * 경우 blablabla은 ... 당신이 실제 테이블에 임시 테이블에서 삽입 할 때 *이 업데이트 테이블이 과장되게 떠벌 림자 = 사건을 설정할 때. 실제 표 값 (blabla, spieler, blabla)을 선택하십시오. 임시 테이블에서 blabla cast (int로 spieler)를 선택하십시오. – MiloBellano

+0

아이디어를 주셔서 감사합니다. 직접 옵션이 있어야한다고 생각하지 않습니까? –

답변

0

@MiloBellano : 답장을 보내 주셔서 다시 한 번 감사드립니다. some1 다른 문제가있을 경우 가져 오기에 대한 전체 스크립트는 다음과 같습니다.

DROP table IF exists temp; 
create table temp (id int(11) AUTO_INCREMENT PRIMARY KEY,spieler varchar(30)); 
LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE temp 
CHARACTER SET latin1 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(id, @dummy,@dummy1,spieler,@dummy2,@dummy3); 

delete from spiele; 
LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE spiele 
CHARACTER SET latin1 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(ID_Spiel, name,dauer,@dummy,@datum,hersteller_id) 
SET erscheinungsdatum = STR_TO_DATE(@datum,'%d.%m.%Y'), 
maxSpieler = 0; 

DROP procedure IF exists test; 

DELIMITER $$ 
CREATE DEFINER='root'@'localhost' PROCEDURE test() 
BEGIN 
DECLARE val1 int(11); 
DECLARE val2 varchar(30); 
DECLARE done INT DEFAULT FALSE; 
DECLARE maxCursor CURSOR FOR SELECT id, spieler FROM ictcampus.temp; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

OPEN maxCursor; 

read_loop: LOOP 
    FETCH maxCursor INTO val1, val2; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
     UPDATE spiele SET maxSpieler= 
      CASE 
       WHEN val2 = "Eins" THEN 1 
       WHEN val2 = "Zwei" THEN 2 
       WHEN val2 = "Drei" THEN 3 
       WHEN val2 = "Vier" THEN 4 
       WHEN val2 = "Fünf" THEN 5 
       WHEN val2 = "Sechs" THEN 6 
       ELSE 0 
      END 
     WHERE ID_Spiel = val1; 
    END LOOP; 
    CLOSE maxCursor; 
END$$ 
DELIMITER ; 


CALL test; 
drop table temp; 
select * from spiele; 
관련 문제