MYSQL中的PATINDEX()替换

MYSQL中的PATINDEX()替换,mysql,sql,sql-server,database,Mysql,Sql,Sql Server,Database,我正在转换一个sql server脚本,其中需要转换MYSQL中的PATINDEX()。请您建议哪一个MYSQL函数类似于PATINDEX(),而MYSQL中没有正式的PATINDEX()函数,既可以使用返回的字符索引实现正则表达式模式查找,也可以将LOCATE()和REGEXP()组合起来,考虑一个用户定义的函数,该函数在字符串的长度中循环遍历每个字符,并检查字符上的 ReGeXP< /代码>模式。创建后,在查询的行中使用此函数 DROP FUNCTION IF EXISTS PatIndex

我正在转换一个sql server脚本,其中需要转换MYSQL中的PATINDEX()。请您建议哪一个MYSQL函数类似于PATINDEX()

,而MYSQL中没有正式的
PATINDEX()
函数,既可以使用返回的字符索引实现正则表达式模式查找,也可以将
LOCATE()
REGEXP()
组合起来,考虑一个用户定义的函数,该函数在字符串的长度中循环遍历每个字符,并检查字符上的<代码> ReGeXP< /代码>模式。创建后,在查询的行中使用此函数

DROP FUNCTION IF EXISTS PatIndex;

DELIMITER $$

CREATE FUNCTION PatIndex(pattern VARCHAR(255), tblString VARCHAR(255)) RETURNS INTEGER
    DETERMINISTIC
BEGIN

    DECLARE i INTEGER;
    SET i = 1;

    myloop: WHILE (i <= LENGTH(tblString)) DO

        IF SUBSTRING(tblString, i, 1) REGEXP pattern THEN
            RETURN(i);
            LEAVE myloop;        
        END IF;    

        SET i = i + 1;

    END WHILE; 

    RETURN(0);

END
在功能上接近PatIndex,但您需要运行MySQL 8.0或更高版本才能使用它

8.0于2018年4月发布。令人困惑的是,8.0之前发布的最后一个版本是5.7。维基百科。

这是我的解决方案:D

ORDER BY
CASE
WHEN instr([column], '[text]') > 0 THEN
  instr([column], '[text]')
WHEN instr([column], '[text]') = 0 THEN
  100(//large number) end ASC 

谢谢你的反馈。但是这个LOCATE()会像PATINDEX一样工作吗?如果字符串与模式匹配,REGXPREGEXP只返回1,如果不匹配,则返回0:
ORDER BY
CASE
WHEN instr([column], '[text]') > 0 THEN
  instr([column], '[text]')
WHEN instr([column], '[text]') = 0 THEN
  100(//large number) end ASC