2016-03-15 55 views
0

我在其具有由的碼和一個標題的字符串一個MySQL表中的列和我需要將它們分爲兩個單獨的列。MySQL的:除去含子標號

目前,只有title列有數據。我可以將title複製到code中,但我想從title列中刪除包含數字的子串,並刪除包含code列中的數字的子串而不是

一個例子值看起來像NWAB110438瀉湖,我想NWAB110438是在code瀉湖title

我知道如何選擇包含的數字記錄,但不知道如何刪除包含一個數字串。

編輯

我還要補充一點,有時候子與數字將在沒有它的子後,有時列將包含只是一個單一的字符串,所以下面都是可能的值:

  • NWAB110438瀉湖
  • 瀉湖NWAB110438
  • 瀉湖
  • NWAB110438

因此,似乎substring_index不會總是匹配正確的值。

+0

有'NWAB110438'和'Lagoon'之間的空間? – Sadikhasan

+0

是的,它們之間有空間。 – Tyssen

回答

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) 
+0

非常完美,非常感謝。 :) – Tyssen

0

在這種情況下,你可以使用substring_index()提取字符串的一部分。