sql-等效于explode()以在MySQL中使用字符串

在MySQL中,当另一个值= opponent2.score时,我希望能够搜索'31 - 7'。在MySQL中用于拆分字符串的语法是什么? 在PHP中,我可能会使用opponent1.score并将它们放在一起。 有没有办法在MySQL中做到这一点?

背景:我正在研究体育比分,并且想尝试比分相同(并且在同一日期)的游戏-每个团队列出的分数与对手的数据库记录相比是倒数的。

理想的MySQL调用将是:

Where opponent1.date = opponent2.date

AND opponent1.score = opponent2.score

(opponent2.score需要向后opponent1.score)。

Bob Cavezza asked 2020-07-31T19:34:26Z

11个解决方案

65 votes

MYSQL没有内置类似apple之类的函数。但是您可以轻松地向数据库中添加类似的函数,然后从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, '');

用法:

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

上面的示例将返回apple。我认为在MySQL中返回数组将是不可能的,因此您必须在pos中指定要显式返回的事件。让我知道您是否成功使用它。

Arman P. answered 2020-07-31T19:40:06Z

46 votes

我尝试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/zh-CN/string-functions.html#function_substring-index]

madde74 answered 2020-07-31T19:40:31Z

23 votes

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

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;

Disha Goyal answered 2020-07-31T19:40:55Z

17 votes

首先,您应该更改数据库结构-这种情况下的分数是某种复合值,应存储在两列中,例如。 "23"、23。

MySQL不提供等效的"23",但是在这种情况下,您可以使用"23"和"23"降低主机和访客的分数。

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 ...;

"23"用于将字符串"23"转换为数字23。

Crozin answered 2020-07-31T19:41:25Z

6 votes

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

我希望这有帮助。

Sergio Rodriguez answered 2020-07-31T19:41:50Z

2 votes

正如@ arman-p指出的那样,MYSQL没有explode()。 但是,我认为提出的解决方案要复杂得多。 要在获得逗号分隔的列表字符串(例如要查找的表键的列表)时进行快速检查,请执行以下操作:

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。 如果不需要它,请不要添加该条件。

Al Zziwa answered 2020-07-31T19:42:14Z

2 votes

使用substring_index,在下面的示例中,我创建了一个表,其中包含列score1和score2,score1具有3-7,score2 7-3等,如图中所示。 下面的查询能够使用“-”进行拆分,并反转得分2的顺序并与得分1比较

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

philip mudenyo answered 2020-07-31T19:42:35Z

1 votes

如果将explode与foreach一起使用以构建新的字符串,则可以通过使用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,'

',part,'')

END WHILE;

RETURN returnstring;

END

此示例将返回部件的html列表。 (必须添加可变长度)

ohjay answered 2020-07-31T19:46:38Z

0 votes

我今天也遇到了同样的问题,并按以下方式解决了该问题,请注意我的情况,我知道串联字符串中的项目数,因此可以通过以下方式恢复它们:

set @var1=0;

set @var2=0;

SELECT SUBSTRING_INDEX('value1,value2', ',', 1) into @var1;

SELECT SUBSTRING_INDEX('value1,value2', ',', -1) into @var2;

变量@ var1和@ var2的值类似于explode()。

DoubleA answered 2020-07-31T19:47:03Z

0 votes

这实际上是所选答案的修改版本,以支持Unicode字符,但是我没有足够的声誉在此发表评论。

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255) CHARSET utf8, delim VARCHAR(12), pos INT) RETURNS varchar(255) CHARSET utf8

RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),

CHAR_LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),

delim, '')

修改如下:

第一个参数设置为CHAR_LENGTH()

该函数设置为返回CHAR_LENGTH()

该代码使用CHAR_LENGTH()而不是LENGTH()来计算字符长度而不是字节长度。

vensires answered 2020-07-31T19:47:40Z

0 votes

我不确定这是否能完全回答问题(不是),但这是我为非常相似的问题想出的解决方案。 我知道其他一些解决方案看起来更短,但是它们似乎比必要的更多地使用了SUBSTRING_INDEX()方法。 在这里,我尝试对每个定界符仅使用一次LOCATE()。

-- *****************************************************************************

-- test_PVreplace

DROP FUNCTION IF EXISTS test_PVreplace;

delimiter //

CREATE FUNCTION test_PVreplace (

str TEXT, -- String to do search'n'replace on

pv TEXT -- Parameter/value pairs 'p1=v1|p2=v2|p3=v3'

)

RETURNS TEXT

-- Replace specific tags with specific values.

sproc:BEGIN

DECLARE idx INT;

DECLARE idx0 INT DEFAULT 1; -- 1-origined, not 0-origined

DECLARE len INT;

DECLARE sPV TEXT;

DECLARE iPV INT;

DECLARE sP TEXT;

DECLARE sV TEXT;

-- P/V string *must* end with a delimiter.

IF (RIGHT (pv, 1) <> '|') THEN

SET pv = CONCAT (pv, '|');

END IF;

-- Find all the P/V pairs.

SELECT LOCATE ('|', pv, idx0) INTO idx;

WHILE (idx > 0) DO

SET len = idx - idx0;

SELECT SUBSTRING(pv, idx0, len) INTO sPV;

-- Found a P/V pair. Break it up.

SELECT LOCATE ('=', sPV) INTO iPV;

IF (iPV = 0) THEN

SET sP = sPV;

SET sV = '';

ELSE

SELECT SUBSTRING(sPV, 1, iPV-1) INTO sP;

SELECT SUBSTRING(sPV, iPV+1) INTO sV;

END IF;

-- Do the substitution(s).

SELECT REPLACE (str, sP, sV) INTO str;

-- Do next P/V pair.

SET idx0 = idx + 1;

SELECT LOCATE ('|', pv, idx0) INTO idx;

END WHILE;

RETURN (str);

END//

delimiter ;

SELECT test_PVreplace ('%one% %two% %three%', '%one%=1|%two%=2|%three%=3');

SELECT test_PVreplace ('%one% %two% %three%', '%one%=I|%two%=II|%three%=III');

SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '%one%=I|%two%=II|%three%=III');

SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '');

SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', NULL);

SELECT test_PVreplace ('%one% %two% %three%', '%one%=%two%|%two%=%three%|%three%=III');

Alan Stewart answered 2020-07-31T19:48:01Z

mysql explode_sql-等效于explode()以在MySQL中使用字符串相关推荐

  1. mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?

    在一个非常通用的水平UPDATE MyTableSET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis' ...

  2. 替换掉mysql数据库指定字段的所有数据的中指定字符串

    我想把表t_user中name字段中type=1的所有数据中带有"-但是-"的字符串全部替换成"-",也即把"-但是"去掉: 执行updat ...

  3. hive/mysql使用lateral view explode时会出现的问题(bug)

    hive/mysql使用lateral view explode时会出现的问题 例子 两边计算的区别 问题说明 例子 两边计算的区别 上面两边代码除了右边对disp_detail和clk_detail ...

  4. mysql 输出解释怎么看_了解MySQL中EXPLAIN解释命令

    1 EXPLAIN概念 EXPLAIN会向我们提供一些MySQL是执行sql的信息: EXPLAIN可以解释说明 SELECT, DELETE, INSERT, REPLACE, and UPDATE ...

  5. swoole mysql 连接数_用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

  6. mysql in从数据库取数_MySQL数据库中 where in 用法详解

    本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...

  7. flask mysql orm_Flask笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy...

    Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...

  8. php mysql备份脚本_MySQL备份脚本,mysql脚本

    MySQL备份脚本,mysql脚本 mysqlbackup.php: php//备份mysql set_time_limit(0); date_default_timezone_set('PRC'); ...

  9. MySQL数据库实用教程考核_《MySQL数据库实用教程》郑明秋,蒙连超,赵海侠【pdf】...

    内容简介 郑明秋.蒙连超.赵海侠主编的<MySQL数据库实用教程>是作者在多年的数据库开发实践与教学经验的基础上,根据计算机相关专业的职业岗位能力需求及学生的认知规律倾心组织编写的.本教材 ...

最新文章

  1. 用神经网络的分类行为理解力的相互作用
  2. NYOJ 801 Haffman编码
  3. 位图布隆过滤器海量数据处理
  4. 再说千遍万遍,都不如这四句话管用,不服不行!
  5. MySQL中的alter table操作之add/modify/drop列
  6. 基于 DirectShow 的播放器
  7. (转)Win10下PostgreSQL10与PostGIS安装
  8. Windows程序中的Lib和Dll文件
  9. 淘宝客SDK,一键导入淘宝客商城,快速实现流量变现,新增商城返利功能
  10. ipa下载安装神器?苹果软件这么容易就被搞定了
  11. 徐亦达老师机器学习课程
  12. 读 Derek Sivers: Anything You Want
  13. 如何让你的小刺猬顺刺
  14. FileZilla文件下载的目录
  15. 前端——HTML,CSS
  16. 企业微信客户端开启开发者模式
  17. 【iOS】【最新】2023苹果开发者账号注册流程(公司类型)
  18. 认识JDBC以及数据库增删查操作
  19. 存储过程 输入输出参数
  20. 存放素数数组JAVA_java – 返回素数数组

热门文章

  1. Linux 常用命令学习总结
  2. 加快AndroidStudio运行速度的方法
  3. 【UV打印机】理光喷头组合说明(8H)
  4. MySql数据库备份的几种方式
  5. Linux下lsof命令的用法
  6. linux lsof 源码分析,linux lsof详解
  7. 从指标管理中获取洞察,赋能公司内部论坛社区运营
  8. 计算机绘制函数图像的心得,用计算机绘制函数图像
  9. vscode苹果调试iMac解决bug
  10. 幽默风趣的程序人生回顾