explode()等同于在MySQL中使用string

在MySQL中,我希望能够search“ '31 - 7' ,当另一个值= '7 - 31' 。 我将用什么语法来分割MySQL中的string? 在PHP中,我可能会使用explode(' - ',$string)并把它们放在一起。 有没有办法在MySQL中做到这一点?

背景:我正在处理体育比分,并想尝试比分相同(也是在同一天)的比赛 – 每个球队列出的分数与其对手的数据库logging相比较。

理想的MySQL调用将是:

 Where opponent1.date = opponent2.date AND opponent1.score = opponent2.score 

opponent2.score将需要是opponent1.score 1.score倒退)。

MYSQL没有explode()像内置的函数,但你可以很容易地添加类似的function到您的数据库,然后从PHP查询使用它。 该function将如下所示:

 CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT) RETURNS VARCHAR(255) RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos), LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), delim, ''); 

用法:

 SELECT SPLIT_STRING('apple, pear, melon', ',', 1) 

上面的例子将返回apple 。 我认为在MySQL中返回数组是不可能的,所以你必须指定在pos显式返回哪个事件。 让我知道你是否成功使用它。

我尝试使用SUBSTRING_INDEX(string,delimiter,count)

 mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com' 

在mysql.com上查看更多http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_substring-index

你可以用这种方式使用存储过程

 DELIMITER | CREATE PROCEDURE explode( pDelim VARCHAR(32), pStr TEXT) BEGIN DROP TABLE IF EXISTS temp_explode; CREATE TEMPORARY TABLE temp_explode (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, word VARCHAR(40)); SET @sql := CONCAT('INSERT INTO temp_explode (word) VALUES (', REPLACE(QUOTE(pStr), pDelim, '\'), (\''), ')'); PREPARE myStmt FROM @sql; EXECUTE myStmt; END | DELIMITER ; 
  • 示例调用:

      SET @str = "The quick brown fox jumped over the lazy dog"; SET @delim = " "; CALL explode(@delim,@str); SELECT id,word FROM temp_explode; 

首先,你应该改变数据库结构 – 在这种情况下得分是某种复合值,应该存储在两列,例如。 score_hostscore_guest


MySQL不提供explode()等效,但在这种情况下,您可以使用SUBSTRING()LOCATE()来截断主机和客人的分数。

 SELECT CONVERT(SUBSTRING(score, 1, LOCATE('-',score) - 2) USING INTEGER) as score_host, CONVERT(SUBSTRING(score, LOCATE('-',score)+2) USING INTEGER) as score_guest FROM ...; 

CONVERT()用于将string"23"转换为数字23

使用此function。 它像一个魅力。 replace“|” 与字符爆炸/拆分和价值1,2,3等基于数据集中的条目数:Value_ONE | Value_TWO | Value_THREE。

 SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 1), '|', -1) AS PSI, SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 2), '|', -1) AS GPM, SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 3), '|', -1) AS LIQUID 

我希望这有帮助。

正如@ arman -p指出MYSQL没有爆炸()。 但是,我认为解决scheme比需要的复杂得多。 要给你一个逗号分隔的列表string(例如,要查找的表键列表)做一个快速检查你做:

 SELECT table_key, field_1, field_2, field_3 FROM my_table WHERE field_3 = 'my_field_3_value' AND (comma_list = table_key OR comma_list LIKE CONCAT(table_key, ',%') OR comma_list LIKE CONCAT('%,', table_key, ',%') OR comma_list LIKE CONCAT('%,', table_key)) 

这假定你也需要在表格上检查field_3。 如果你不需要它,不要添加这个条件。

我今天面临同样的问题,并解决它,如下所示,请注意在我的情况下,我知道连接string中的项目数,因此我可以这样恢复它们:

 set @var1=0; set @var2=0; SELECT SUBSTRING_INDEX('value1,value2', ',', 1) into @var1; SELECT SUBSTRING_INDEX('value1,value2', ',', -1) into @var2; 

variables@ var1和@ var2将具有类似于explode()的值。

使用substring_index,在下面的例子中,我创build了一个表格,列中有score1和score2,score1有3-7,score2 7-3等,如图所示。 下面的查询可以使用“ – ”进行分割,并反转score2的顺序并与score1进行比较

 SELECT CONCAT(SUBSTRING_INDEX(score1,'-',1), SUBSTRING_INDEX(score1,'-',-1)) as my_score1, CONCAT(SUBSTRING_INDEX(score2,'-',-1),SUBSTRING_INDEX(score2,'-',1)) as my_score2 FROM test HAVING my_score1=my_score2 

成绩表

查询结果

如果爆炸与foreach一起使用来build立一个新的string,你可以使用while循环来模拟爆炸:

 CREATE FUNCTION explode_and_loop(sep VARCHAR(),inputstring VARCHAR()) RETURNS VARCHAR() BEGIN DECLARE part,returnstring VARCHAR(); DECLARE cnt,partsCnt INT(); SET returnstring = ''; SET partsCnt = ((LENGTH(inputstring ) - LENGTH(REPLACE(inputstring,sep,''))) DIV LENGTH(sep); SET cnt = 0; WHILE cnt <= partsCnt DO SET cnt = cnt + 1; SET part = SUBSTRING_INDEX(SUBSTRING_INDEX(inputstring ,sep,cnt),sep,-1); -- DO SOMETHING with the part eg make html: SET returnstring = CONCAT(returnstring,'<li>',part,'</li>') END WHILE; RETURN returnstring; END 

这个例子将返回一个部件的html列表。 (必须添加必需的可变长度)