的字符串提供給您一個具有兩種類型分隔符的字符串。提供了表格的模式。如何以有效的方式將分隔字符串轉換爲臨時表?例如,將字符串轉換爲模式爲
Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany
我是MySql的新手。所以任何幫助將不勝感激?
的字符串提供給您一個具有兩種類型分隔符的字符串。提供了表格的模式。如何以有效的方式將分隔字符串轉換爲臨時表?例如,將字符串轉換爲模式爲
Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany
我是MySql的新手。所以任何幫助將不勝感激?
我會這樣寫它也許有足夠的方式與名稱,但它必須工作!
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;
我正在mysql工作臺中執行上述查詢的結果集並不像預期的那樣。當實際記錄必須是4時,只有三條記錄來到 –
@shikharMaheshwari修復它! –
你的答案代碼不起作用!白衣我應該更換cwuser? –
謝天謝地,我寫了一個簡單的代碼爲我自己:
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 ;
請不要忘記使用上述SP後刪除臨時表temporary_split_table。
上述方法,其SP調用是:
call split_procedure('Andy~22~US|Jane~24~Australia|Davis~30~UK|Nancy~32~Germany', '|', '~');
使用一些服務器端腳本(如PHP)的任何選項,或者你只堅持SQL? – mitkosoft
僅在MySql中。我知道如何在c#和php中做同樣的事情。不管怎樣,謝謝。感謝您的關注。 –
它會很容易 – mitkosoft