sql
1 UPDATE title SET sub_no = SUBSTRING_INDEX ( SUBSTRING_INDEX ( sub , '(' , - 1 ) , ')' , 1 ) ;
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_substring-index
文字列 str から、区切り文字 delim が count 回出現する前の部分文字列を返します。count が正の値の場合は、(左から数えて) 最後の区切り文字の左側にあるすべてが返されます。count が負の値の場合は、(右から数えて) 最後の区切り文字の右側にあるすべてが返されます。
動作結果
sql
1 mysql > CREATE TABLE title (
2 - > ` div ` INT ,
3 - > sub VARCHAR ( 16 ) ,
4 - > sub_no INT
5 - > ) ;
6 Query OK , 0 rows affected ( 0.02 sec )
7
8 mysql > INSERT INTO title ( ` div ` , sub ) VALUES
9 - > ( 1000 , 'カローラ(東京)販売(1)' ) ,
10 - > ( 1001 , 'セリカ販売(31)' ) ,
11 - > ( 1002 , 'ブルーバード(多摩)販売(14)' ) ,
12 - > ( 1003 , 'コロナ販売(15)' ) ;
13 Query OK , 4 rows affected ( 0.01 sec )
14 Records: 4 Duplicates: 0 Warnings : 0
15
16 mysql > SELECT * FROM title ;
17 + ------+--------------------------------------+--------+
18 | div | sub | sub_no |
19 + ------+--------------------------------------+--------+
20 | 1000 | カローラ ( 東京 ) 販売 ( 1 ) | NULL |
21 | 1001 | セリカ販売 ( 31 ) | NULL |
22 | 1002 | ブルーバード ( 多摩 ) 販売 ( 14 ) | NULL |
23 | 1003 | コロナ販売 ( 15 ) | NULL |
24 + ------+--------------------------------------+--------+
25 4 rows in set ( 0.00 sec )
26
27 mysql > UPDATE title SET sub_no = SUBSTRING_INDEX ( SUBSTRING_INDEX ( sub , '(' , - 1 ) , ')' , 1 ) ;
28 Query OK , 4 rows affected ( 0.00 sec )
29 Rows matched : 4 Changed: 4 Warnings : 0
30
31 mysql > SELECT * FROM title ;
32 + ------+--------------------------------------+--------+
33 | div | sub | sub_no |
34 + ------+--------------------------------------+--------+
35 | 1000 | カローラ ( 東京 ) 販売 ( 1 ) | 1 |
36 | 1001 | セリカ販売 ( 31 ) | 31 |
37 | 1002 | ブルーバード ( 多摩 ) 販売 ( 14 ) | 14 |
38 | 1003 | コロナ販売 ( 15 ) | 15 |
39 + ------+--------------------------------------+--------+
40 4 rows in set ( 0.00 sec )
ちなみにこのご質問は、以前のご質問とほぼ同じ内容です。
https://teratail.com/questions/78649
もう少し慎重に過去の投稿などを調べてみてください。
()の存在しない場合は、
div sub sub_no
1003 クラウン販売
のようにsub_noをNULLにしたいと考えています。
「()の存在しない場合」の他にも「正しくない形式」のパターンを挙げだすと、キリがありません。
例えば
ほげ(5a)
のように、() の中に数字以外の文字が混ざっている
ほげ 10)
のように、カッコの開閉が対応していない
など。
なので、以下のように「正しい形式」のレコードと「正しくない形式」のレコードを別々に更新するのが良いと思います。
「正しい形式」に対する UPDATE文
sql
1 UPDATE title
2 SET sub_no = REPLACE ( SUBSTRING_INDEX ( sub , '(' , - 1 ) , ')' , '' )
3 WHERE sub REGEXP '.*\\([0-9]+\\)$' ;
「正しくない形式」に対する UPDATE文
sql
1 UPDATE title
2 SET sub_no = NULL
3 WHERE sub NOT REGEXP '.*\\([0-9]+\\)$' ;
ただし、MySQL の REGEXP関数はマルチバイトセーフではないため、正しい/正しくない を誤って判定する可能性はあります。
https://dev.mysql.com/doc/refman/5.6/ja/regexp.html
REGEXP および RLIKE 演算子はバイト単位で機能するため、マルチバイトセーフではなく、マルチバイト文字セットを使用すると想定外の結果が生成される可能性があります。
もし、上の方法でもうまくいかない場合は、スクリプトを組んで1行ずつ
を繰り返すのが、結局は最も確実な方法だと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/05 05:35
2017/08/05 06:24
2017/08/05 09:01