回答編集履歴

1

回答を追記

2017/08/05 06:23

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -107,3 +107,83 @@
107
107
 
108
108
 
109
109
  もう少し慎重に過去の投稿などを調べてみてください。
110
+
111
+
112
+
113
+ ---
114
+
115
+ > ()の存在しない場合は、
116
+
117
+ div sub sub_no
118
+
119
+ 1003 クラウン販売  
120
+
121
+ のようにsub_noをNULLにしたいと考えています。
122
+
123
+
124
+
125
+ 「()の存在しない場合」の他にも「正しくない形式」のパターンを挙げだすと、キリがありません。
126
+
127
+ 例えば
128
+
129
+ - `ほげ(5a)`のように、() の中に数字以外の文字が混ざっている
130
+
131
+ - `ほげ 10)`のように、カッコの開閉が対応していない
132
+
133
+
134
+
135
+ など。
136
+
137
+
138
+
139
+ なので、以下のように「正しい形式」のレコードと「正しくない形式」のレコードを別々に更新するのが良いと思います。
140
+
141
+
142
+
143
+ ###### 「正しい形式」に対する UPDATE文
144
+
145
+ ```sql
146
+
147
+ UPDATE title
148
+
149
+ SET sub_no = REPLACE(SUBSTRING_INDEX(sub, '(', -1), ')', '')
150
+
151
+ WHERE sub REGEXP '.*\\([0-9]+\\)$';
152
+
153
+ ```
154
+
155
+
156
+
157
+ ###### 「正しくない形式」に対する UPDATE文
158
+
159
+ ```sql
160
+
161
+ UPDATE title
162
+
163
+ SET sub_no = NULL
164
+
165
+ WHERE sub NOT REGEXP '.*\\([0-9]+\\)$';
166
+
167
+ ```
168
+
169
+
170
+
171
+ ---
172
+
173
+ ただし、MySQL の REGEXP関数はマルチバイトセーフではないため、正しい/正しくない を誤って判定する可能性はあります。
174
+
175
+ [https://dev.mysql.com/doc/refman/5.6/ja/regexp.html](https://dev.mysql.com/doc/refman/5.6/ja/regexp.html)
176
+
177
+ > REGEXP および RLIKE 演算子はバイト単位で機能するため、マルチバイトセーフではなく、マルチバイト文字セットを使用すると想定外の結果が生成される可能性があります。
178
+
179
+
180
+
181
+ もし、上の方法でもうまくいかない場合は、スクリプトを組んで1行ずつ
182
+
183
+ ```
184
+
185
+ 形式のチェック -> UPDATE
186
+
187
+ ```
188
+
189
+ を繰り返すのが、結局は最も確実な方法だと思います。