相当于explode()在MySQL中使用字符串

Bob*_*zza 44 mysql sql

在MySQL中,我希望能够'31 - 7'在另一个值=时搜索'7 - 31'.我会用什么语法来分解MySQL中的字符串?在PHP中,我可能会使用explode(' - ',$string)它们并将它们组合在一起.有没有办法在MySQL中这样做?

背景:我正在使用体育比分,并希望尝试得分相同的比赛(以及同一日期) - 每支球队的列出得分与对手的数据库记录相比是倒退的.

理想的MySQL调用是:

Where opponent1.date  = opponent2.date
  AND opponent1.score = opponent2.score
Run Code Online (Sandbox Code Playgroud)

(opponent2.score需要opponent1.score倒退).

Arm*_* P. 69

MYSQL没有explode()内置的类似功能.但是你可以轻松地向你的数据库添加类似的功能,然后从php查询中使用它.该功能将如下所示:

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, '');
Run Code Online (Sandbox Code Playgroud)

用法:

SELECT SPLIT_STRING('apple, pear, melon', ',', 1)
Run Code Online (Sandbox Code Playgroud)

上面的例子将返回apple.我认为在MySQL中返回数组是不可能的,因此您必须指定明确返回的事件pos.如果您成功使用它,请告诉我.

  • 我需要在我的一台服务器中将此函数声明为 DETERMINISTIC。像这里:返回 VARCHAR(255) 确定性返回 (2认同)
  • 不错的功能,但你应该[用 CHAR_LENGTH()` 替换 `LENGTH()`](/sf/ask/2017170851/ -with-polish-special-ch),如果您使用多字节字符集。 (2认同)

小智 47

我试着用 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'
Run Code Online (Sandbox Code Playgroud)

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


Dis*_*yal 23

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

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 ;
Run Code Online (Sandbox Code Playgroud)

  • 我不确定这是非常辉煌还是非常危险. (14认同)

Cro*_*zin 17

首先,您应该更改数据库结构 - 在这种情况下,得分是某种复合值,应该存储在两列中,例如.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 ...;
Run Code Online (Sandbox Code Playgroud)

CONVERT()用于将字符串"23"转换为数字23.


Ser*_*uez 6

使用此功能。它像一种魅力。替换“ |” 具有要爆炸/拆分的字符,值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
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。