从字段中提取一些字符

时间:2015-04-24 09:17:04

标签: mysql

我有这个字段:

Pb de HSPA Rab setup sur SFX4149F11 depuis 18/11

我的目标是在'sur'之后取三个字符。 我试过这个功能。但结果却显得空洞。

delimiter |
CREATE FUNCTION METTRE(s VARCHAR(2000)) RETURNS varchar(2000)
DETERMINISTIC
   BEGIN
           DECLARE open  INT;
           DECLARE close  INT;
           DECLARE someLimit  INT;
           DECLARE str  VARCHAR(2000);
           DECLARE toFind  VARCHAR(2000);
           DECLARE nom VARCHAR(20000);
           SET open = 1;
           SET close = 1;
           SET toFind = s ;
           SET someLimit = 100;
           SET str ='';
           WHILE close > 0 and open > 0 and someLimit > 0 DO
             SET someLimit = someLimit -1;
             SET open = locate('sur',toFind);
             IF open > 0 THEN
               SET toFind = SUBSTRING(toFind,open);
               SET close = locate(4,toFind);
               IF close > 2 THEN
                  SET nom=SUBSTRING(toFind,2,close-2);
                  SET toFind = SUBSTRING(toFind,close); 
               END IF;
             END IF;
           END WHILE;
           return SUBSTRING(str,2);

   END |
delimiter;

感谢。

1 个答案:

答案 0 :(得分:0)

如果你总是在sur之后寻找3个字符,如果之后有空格,那么可以更轻松地完成

mysql> 
select 
substring(
 trim(
  substring_index(
    'Pb de HSPA Rab setup sur SFX4149F11 depuis 18/11','sur ',-1
  )
 ),
1,3) as n;
+-----+
| n   |
+-----+
| SFX |
+-----+

在上面,只需用表

中的column_name替换硬编码数据
select 
substring(
 trim(
  substring_index(
    yor_col_name,'sur ',-1
  )
 ),
1,3) as n

从评论看起来你正在尝试更新同一个表中的其他一些列,所以这里有一个如何做到这一点的例子

mysql> select * from test ;
+--------------------------------------------------+-------------+
| val                                              | Affected_CI |
+--------------------------------------------------+-------------+
| Pb de HSPA Rab setup sur SFX4149F11 depuis 18/11 | NULL        |
| Pb de HSPA Rab setup sur LJK4149F11 depuis 18/11 | NULL        |
| Pb de HSPA Rab setup sur MSP4149F11 depuis 18/11 | NULL        |
+--------------------------------------------------+-------------+


mysql> update test set Affected_CI = substring(trim(substring_index(val,'sur ',-1)),1,3) ;
Query OK, 2 rows affected (0.04 sec)
Rows matched: 3  Changed: 2  Warnings: 0

mysql> select * from test ;
+--------------------------------------------------+-------------+
| val                                              | Affected_CI |
+--------------------------------------------------+-------------+
| Pb de HSPA Rab setup sur SFX4149F11 depuis 18/11 | SFX         |
| Pb de HSPA Rab setup sur LJK4149F11 depuis 18/11 | LJK         |
| Pb de HSPA Rab setup sur MSP4149F11 depuis 18/11 | MSP         |
+--------------------------------------------------+-------------+