Mysql 错误代码:1064。SQL语法中有一个错误-STRING\u SPLIT

Mysql 错误代码:1064。SQL语法中有一个错误-STRING\u SPLIT,mysql,sql,Mysql,Sql,shotsId是一个类似12-1-8-7的字符串。。。npNumberid以“-”分隔 很遗憾,查询返回以下错误: 错误代码:1064。您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 第7行使用near'(eo.photoId,'-')的语法 如果您能提供任何帮助,我们将不胜感激。请尝试使用正则表达式进行匹配,而不是拆分字符串,将出现错误的代码替换为 SELECT er.pNumber, er.name, ep.fPosition, eo.res FROM events_s

shotsId是一个类似12-1-8-7的字符串。。。npNumberid以“-”分隔

很遗憾,查询返回以下错误:

错误代码:1064。您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 第7行使用near'(eo.photoId,'-')的语法


如果您能提供任何帮助,我们将不胜感激。

请尝试使用正则表达式进行匹配,而不是拆分字符串,将出现错误的代码替换为

SELECT er.pNumber, er.name, ep.fPosition, eo.res
FROM events_shot er, events_shot_final ep, events_shot_final_res eo, events_gear era
WHERE era.idShot=er.idShot AND ep.idPhoto=era.idPhoto AND eo.idShot=era.idShot
    AND era.idShot=42 AND eo.shotType='PRT'
    AND er.pNumber IN (
        SELECT *
        FROM STRING_SPLIT(eo.photosId,'-')
        )
更新

下面的正则表达式不匹配破折号破折号,而只匹配给定的确切数字

AND REGEXP_INSTR(eo.photosId, CONCAT('-?', er.pNumber, '-?')) > 0

数据库结构不好,
eo.photoId
应该是一个单独的表

但在不改变数据库结构的情况下,您有一个极不理想的解决方案:

AND REGEXP_INSTR(eo.photosId, CONCAT('(^|[^0-9])', er.pNumber, '([^0-9]|$)')) > 0

您必须将
12-1-8-7
更改为
-12-1-8-7-
,并使用分隔符
-1-
+
%
-查找ID,就像SQL Server 2016中使用的任何字符操作符一样,而不是MySQL.eo中使用的字符操作符一样。上面的代码中不会出现组合!你确定是同一个代码吗?但mysql中不存在yes字符串_SPLIT。您正在MySQL中使用SQL Server函数,并且从另一个查询中发出错误消息。在任何类型的编码中,对细节的关注都会带来巨大的回报。如果您有任何控制权,请更改数据库设计。在带分隔符的字符串中放入多个值违反了各种SQL原则。正确的设计是为每个值单独设置一行(搜索范式)。这样,您就不必在拆分字符串时乱来,您可以利用索引和约束(加上1001个其他好处)。(不相关)切换到现代的显式
JOIN
语法!更容易编写(没有错误),更容易阅读和维护,如果需要,更容易转换为外部联接。@Diego在所有注释和答案中,您选择了错误的一个。无论
-
和其他字符如何,这都将返回匹配。它将匹配
123-456-789
中的
56
。它将匹配
123 456 789
中的
56
。它将在
123456789
中匹配
56
@GSerg谢谢,很遗憾,我现在无法测试代码,我必须尽快找到解决方案possible@Diego我添加了第二个更精确的版本,您无需更改数据即可正常工作。@JoakimDanielson-MySql。所以你的表达式仍然与
123456789
中的
56
匹配@GSerg,我太邋遢了。固定的
AND concat('%-', er.pNumber,'-%') LIKE concat('-', eo.photosId, '-')