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_host
, score_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列表。 (必须添加必需的可变长度)