Mysql 选择特定字符串后面的下10个字符

Mysql 选择特定字符串后面的下10个字符,mysql,substr,locate,Mysql,Substr,Locate,我正试图找出如何创建一个MySQL查询,该查询将允许我在消息字段中仅显示字符串“filter”后面的10个字符。字符串“filter”出现在每条记录的不同位置,因此我不能使用位置过滤器 我一直在尝试使用下面的内容,但是我无法获得正确的查询 SELECT RIGHT(Message,LOCATE('filter',Message) - 10) FROM table 表中的消息字段记录如下所示: QgySSW8fwD25iQ.filter0019p3las1-31205-59C3D 6t2fJw.

我正试图找出如何创建一个MySQL查询,该查询将允许我在消息字段中仅显示字符串“filter”后面的10个字符。字符串“filter”出现在每条记录的不同位置,因此我不能使用位置过滤器

我一直在尝试使用下面的内容,但是我无法获得正确的查询

SELECT RIGHT(Message,LOCATE('filter',Message) - 10) FROM table
表中的消息字段记录如下所示:

QgySSW8fwD25iQ.filter0019p3las1-31205-59C3D
6t2fJw.filter0010p3las1-9745-59
filter0025p3las1-13130-59C3D317
我希望他们在查询后看起来像这样:

0019p3las1
0010p3las1
0025p3las1
非常感谢您的帮助。

请参阅

结果表结构

Create table resulttbl ( 
    id int(6) primary key auto_increment ,
    resultFIlter varchar(1000)
);
CREATE PROCEDURE FilterTable()
BEGIN
  DECLARE i INTEGER;
  DECLARE endpos INTEGER;
DECLARE fullstr VARCHAR(1000);
DECLARE result VARCHAR(1000);
SET fullstr = 'QgySSW8fwD25iQ.filter0019p3las1-31205-59C3D 6t2fJw.filter0010p3las1-9745-59 filter0025p3las1-13130-59C3D317';
  SET i = 2;
  SET endpos=LENGTH(fullstr) - LENGTH(REPLACE(fullstr, 'filter', '')) ;

   delete  from resulttbl;
   REPEAT
      SET result=strSplit(fullstr, 'filter', i);

      IF result IS NOT NULL THEN
        SET result=LEFT(result,10);
       INSERT INTO resulttbl (resultFIlter)  values(result);
       END IF;
    SET i = i + 1;
   UNTIL i >= endpos 
   END REPEAT;

END ;
用于拆分字符串的函数

CREATE FUNCTION strSplit(x VARCHAR(65000), delim VARCHAR(12), pos INTEGER) 
RETURNS VARCHAR(65000)
BEGIN
  DECLARE output VARCHAR(65000);
  SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos)
                 , LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1)
                 , delim
                 , '');
  IF output = '' THEN SET output = null; END IF;
  RETURN output;
END;
要拆分并插入结果表的存储过程

Create table resulttbl ( 
    id int(6) primary key auto_increment ,
    resultFIlter varchar(1000)
);
CREATE PROCEDURE FilterTable()
BEGIN
  DECLARE i INTEGER;
  DECLARE endpos INTEGER;
DECLARE fullstr VARCHAR(1000);
DECLARE result VARCHAR(1000);
SET fullstr = 'QgySSW8fwD25iQ.filter0019p3las1-31205-59C3D 6t2fJw.filter0010p3las1-9745-59 filter0025p3las1-13130-59C3D317';
  SET i = 2;
  SET endpos=LENGTH(fullstr) - LENGTH(REPLACE(fullstr, 'filter', '')) ;

   delete  from resulttbl;
   REPEAT
      SET result=strSplit(fullstr, 'filter', i);

      IF result IS NOT NULL THEN
        SET result=LEFT(result,10);
       INSERT INTO resulttbl (resultFIlter)  values(result);
       END IF;
    SET i = i + 1;
   UNTIL i >= endpos 
   END REPEAT;

END ;
使用语句
callfiltertable()
调用该过程。 现在,您的过程结果可在表
resulttbl
中找到。 您可以使用
select
语句作为
select*fromsresulttbl
从该表中获取值

结果

id  resultFIlter
1   0019p3las1
2   0010p3las1
3   0025p3las1

在子字符串()中使用LOCATE()的组合。看到这个了吗

查询1

select
SUBSTRING(message,LOCATE('filter',Message)+6,10)
from table1
| SUBSTRING(message,LOCATE('filter',Message)+6,10) |
|--------------------------------------------------|
|                                       0019p3las1 |
|                                       0010p3las1 |
|                                       0025p3las1 |
请注意+6是“filter”长度的偏移量,因为LOCATE查找“f”的位置,然后需要为其他字符“ilter”添加6。一旦确定了这个数字,就只需获得接下来的10个字符

select
SUBSTRING(message,LOCATE('filter',Message)+6,10)
from table1
| SUBSTRING(message,LOCATE('filter',Message)+6,10) |
|--------------------------------------------------|
|                                       0019p3las1 |
|                                       0010p3las1 |
|                                       0025p3las1 |

这是您的预期输出吗?