选择Next 10特殊字符串后的字符

时间:2017-09-21 23:44:36

标签: mysql substr locate

我试图找出如何创建单个MySQL查询,这将允许我只显示字符串后面的接下来的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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

在SUBSTRING()中使用LOCATE()的组合。见SQL Fiddle

CREATE TABLE Table1
    (`message` varchar(200))
;

INSERT INTO Table1
    (`message`)
VALUES
    ('QgySSW8fwD25iQ.filter0019p3las1-31205-59C3D'),
    ('6t2fJw.filter0010p3las1-9745-59'),
    ('filter0025p3las1-13130-59C3D317')
;

查询1

select
SUBSTRING(message,LOCATE('filter',Message)+6,10)
from table1

请注意,+ 6将偏移"过滤器"因为LOCATE找到" f"的位置然后你需要为其他角色添加6" ilter"。确定该数字后,只需获得接下来的10个字符。

<强> Results

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

答案 1 :(得分:0)

请参阅SQLFiddle

结果表结构

Create table resulttbl ( 
    id int(6) primary key auto_increment ,
    resultFIlter varchar(1000)
);

分割字符串的功能

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

使用语句CALL FilterTable()调用该过程。 现在,您可以在表resulttbl上找到您的程序结果。 您可以使用select语句SELECT * from resulttbl从该表中获取值。

<强>结果

id  resultFIlter
1   0019p3las1
2   0010p3las1
3   0025p3las1