MYSQL中的PATINDEX()替换
我正在转换一个sql server脚本,其中需要转换MYSQL中的PATINDEX()。请您建议哪一个MYSQL函数类似于PATINDEX(),而MYSQL中没有正式的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
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