2016-04-22 6 views
1

区切り文字には2種類の区切り文字があります。表のスキーマが提供されています。どのように区切られた文字列を効率的な方法で一時テーブルに変換するのですか?たとえば、スキーマを使用して文字列を表に変換するには

Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany 

私はMySqlを初めて利用しています。だから、どんな助けも大いに評価されますか?

+0

またはあなただけのSQLを主張:

SPの上に呼び出す方法がありますか? – mitkosoft

+0

MySqlのみです。私はC#とPHPで同じことをする方法を知っています。とりあえずありがとう。あなたの懸念を感謝します。 –

+0

それは簡単になるでしょう – mitkosoft

答えて

0

私はこれを書いているかもしれませんが、名前には十分な方法があるかもしれませんが、それはうまくいきます!

Create table MIX (
`id` int not null, 
`x` text not null) 
ENGINE = InnoDB; 
insert into mix value (1,'Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany'); 
create table unmix select 
numbers.n as id, 
SUBSTRING_INDEX(SUBSTRING_INDEX(x, '~', 2*numbers.n),'~', -1) as Age, 
SUBSTRING_INDEX(SUBSTRING_INDEX(x, '|', 1*numbers.n),'~', -1) as Country, 
substring_index(SUBSTRING_INDEX(SUBSTRING_INDEX(x,'~', 2*numbers.n),'|',-1),'~',+1) as Name 
from 
(select 1 n union all 
select 2 union all 
select 3 union all select 4) 
numbers INNER JOIN mix 
on CHAR_LENGTH(mix.x) 
-CHAR_LENGTH(REPLACE(mix.x, ' ', ''))>=numbers.n-4; 
+0

上記のクエリをmysql workbenchで実行している結果セットが期待どおりではありません。実際のレコードが4でなければならないときに来るレコードは3つだけです。 –

+0

@shikharMaheshwariはそれを修正しました! –

+0

あなたの答えたコードは動作しません!ちょっと私はcwuserを置き換える必要がありますか? –

0

ありがたいことに私は自分のために簡単なコードを書いた:上記のSPを使用した後、一時テーブルtemporary_split_tableを削除することを忘れないでください

DROP procedure IF EXISTS `split_procedure`; 

DELIMITER $$ 

CREATE DEFINER=`cwuser`@`%%` PROCEDURE `split_procedure`(v_stringtosplit text, v_rowdelim CHAR(5), v_coldelim CHAR(5)) 
BEGIN 

SET @replacetosplit := REPLACE(v_stringtosplit, v_rowdelim, '"),("'); 
SET @replacetosplit := REPLACE(@replacetosplit, v_coldelim, '","'); 

SET v_stringtosplit = CONCAT(v_rowdelim, v_stringtosplit); 

SET @no_of_rows = length(v_stringtosplit) - length(replace(v_stringtosplit, v_rowdelim, '')); 
SET @rownum = 1; 
SET @no_of_cols = length(v_stringtosplit) - length(replace(v_stringtosplit, v_coldelim, '')); 
SET @no_of_cols = (@no_of_cols/@no_of_rows); 
SET @colnum = 1; 

DROP TABLE IF EXISTS temporary_split_table; 

SET @strtabcol = 'CREATE TEMPORARY TABLE temporary_split_table ('; 
SET @valcol = ''; 

WHILE(@colnum <= @no_of_cols + 1) 
DO 
    SET @strtabcol = CONCAT(@strtabcol, 'COL', @colnum, ' VARCHAR(1000)', ','); 
    SET @colnum = @colnum + 1; 
END WHILE; 

SET @strtabcol = CONCAT(LEFT(@strtabcol, LENGTH(@strtabcol)-1), ')'); 

PREPARE stmt FROM @strtabcol; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SET @strcol = 'INSERT INTO temporary_split_table VALUES("'; 

SET @strcol = CONCAT(@strcol, @replacetosplit, '")'); 
PREPARE stmt FROM @strcol; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SELECT * FROM temporary_split_table; 

END$$ 

DELIMITER ; 

を。 (PHPのような)一部のサーバーサイドスクリプトを使用するには、いずれかのオプション

call split_procedure('Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany', '|', '~'); 
関連する問題