MySQL:删除包含数字的子串

时间:2016-03-15 05:54:13

标签: mysql

我在MySQL表中有一个列,其中包含一个由代码和标题组成的字符串,我需要将它们分成两个单独的列。

目前,只有title列包含数据。我可以将title复制到code,但之后我想删除包含title列中数字的子字符串,并删除包含来自code数字的 的子字符串}专栏。

示例值看起来像 NWAB110438 Lagoon ,我希望 NWAB110438 位于code和{em> Lagoon {{1} }。

我知道如何选择包含数字的记录,但不知道如何删除包含数字的子字符串。

修改

我还应该补充一点,有时带数字的子字符串将在没有它的子字符串之后,有时列只包含一个子字符串,因此以下是所有可能的值:

  • NWAB110438 Lagoon
  • Lagoon NWAB110438
  • 礁湖
  • NWAB110438

所以似乎substring_index总是不匹配正确的值。

3 个答案:

答案 0 :(得分:1)

使用SUBSTRING_INDEX,INSTR,REGEXP和完整演示的解决方案。

SQL:

-- data
create table t1(title varchar(100), code varchar(100));
insert into t1 values
('NWAB110438 Lagoon', 'NWAB110438 Lagoon'),
('Lagoon NWAB110438', 'Lagoon NWAB110438'),
('Lagoon', 'Lagoon'),
('NWAB110438', 'NWAB110438');
select * from t1;

-- query wanted
UPDATE t1
SET 
    title = TRIM(CONCAT(IF((@first := SUBSTRING_INDEX(title, ' ', 1)) REGEXP '[0-9]+', '', @first), 
                        ' ', 
                        IF((@second := IF(INSTR(title, ' '), SUBSTRING_INDEX(title, ' ', -1), '')) REGEXP '[0-9]+', '', @second))),
    code = TRIM(CONCAT(IF(@first REGEXP '[0-9]+', @first, ''), 
                        ' ', 
                        IF(@second REGEXP '[0-9]+', @second, '')));
select * from t1;

输出:

mysql> select * from t1;
+-------------------+-------------------+
| title             | code              |
+-------------------+-------------------+
| NWAB110438 Lagoon | NWAB110438 Lagoon |
| Lagoon NWAB110438 | Lagoon NWAB110438 |
| Lagoon            | Lagoon            |
| NWAB110438        | NWAB110438        |
+-------------------+-------------------+
4 rows in set (0.00 sec)

mysql> UPDATE t1
    -> SET
    ->     title = TRIM(CONCAT(IF((@first := SUBSTRING_INDEX(title, ' ', 1)) REGEXP '[0-9]+', '', @first),
    ->                         ' ',
    ->                         IF((@second := IF(INSTR(title, ' '), SUBSTRING_INDEX(title, ' ', -1), '')) REGEXP '[0-9]+', '', @second))),
    ->     code = TRIM(CONCAT(IF(@first REGEXP '[0-9]+', @first, ''),
    ->                         ' ',
    ->                         IF(@second REGEXP '[0-9]+', @second, '')));
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from t1;
+--------+------------+
| title  | code       |
+--------+------------+
| Lagoon | NWAB110438 |
| Lagoon | NWAB110438 |
| Lagoon |            |
|        | NWAB110438 |
+--------+------------+
4 rows in set (0.00 sec)

答案 1 :(得分:0)

在这种情况下,我建议使用php来执行单独的功能 对于纯MySQL,我找到了一个可能对你有帮助的链接。

选择SUBSTRING_INDEX(' www.mytestpage.info','。',2);

http://www.w3resource.com/mysql/string-functions/mysql-substring_index-function.php

答案 2 :(得分:0)

在这种情况下,您可以使用substring_index()来提取字符串的一部分。