2013年7月4日木曜日

LIKE REGEXPのSUBSTRINGでオプションを更新し、LOCATE

Original post: http://anothermysqldba.blogspot.com/2013/07/update-options-with-like-regexp.html

最近のフォーラム投稿は私が停止し、一瞬考えさせられました..
http://forums.mysql.com/read.php?10、589573,589573#MSG-589573

問題は、ユーザーが言葉だけアウディとしない単語監査を更新したかったのでした。
これは、簡単にかつて私はSUBSTRINGを使用して見つけよう停止期間を利用して解決した。彼らはすべての後に迅速かつ容易に修正を求めていました。


root@localhost [test]> CREATE TABLE `forumpost` (
-> `name` varchar(255) DEFAULT NULL
-> ) ENGINE=InnoDB;

root@localhost [test]> insert into forumpost value ('An auditor drives an audi.'),('An auditor drives a volvo.');

root@localhost [test]> select * from forumpost;
+----------------------------+
| name |
+----------------------------+
| An auditor drives an audi. |
| An auditor drives a volvo. |
+----------------------------+ 


だから今、私たちはそれの期間を利用して、迅速かつ簡単な方法を更新してみましょう

root@localhost [test]>UPDATE forumpost SET name = REPLACE(name, 'audi.', 'toyota.') WHERE name LIKE '%audi.';
Query OK, 1 row affected (0.20 sec)
Rows matched: 1 Changed: 1 Warnings: 0

root@localhost [test]> select * from forumpost;
+------------------------------+
| name |
+------------------------------+
| An auditor drives an toyota. |
| An auditor drives a volvo. |
+------------------------------+ 


しかし... SUBSTRINGの有効なオプションについて何とLOCATE .....


root@localhost [test]> insert into forumpost value ('An auditor drives an audi.');
root@localhost [test]> insert into forumpost value ('An auditor drives an audi car');
root@localhost [test]> select * from forumpost;
+-------------------------------+
| name |
+-------------------------------+
| An auditor drives an toyota. |
| An auditor drives a volvo. |
| An auditor drives an audi. |
| An auditor drives an audi car |
+-------------------------------+ 


あなたは、あなたが後にあるものを見つけることができますことを確認しますので、最初にあなたのオプションをテスト..


root@localhost [test]> SELECT * FROM forumpost WHERE name REGEXP 'audi car$';
+-------------------------------+
| name |
+-------------------------------+
| An auditor drives an audi car |
+-------------------------------+ 

root@localhost [test]> SELECT * FROM forumpost WHERE name LIKE '%audi car%';
+-------------------------------+
| name |
+-------------------------------+
| An auditor drives an audi car |
+-------------------------------+


我々は単に単語の車のため期間を変更したので、それは本当にあまりにもしませんでした。だから続ける....

私たちは、アウディ車でラインからわずかワードアウディをプルする必要があります。

root@localhost [test]> SELECT SUBSTRING(name,-8,4), name FROM forumpost WHERE SUBSTRING(name,-8,4) = 'audi';
+----------------------+-------------------------------+
| SUBSTRING(name,-8,4) | name |
+----------------------+-------------------------------+
| audi | An auditor drives an audi car |
+----------------------+-------------------------------+ 


SUBSTRINGは、私はバックエンドから8文字を数えた後、私は最初の4文字を引くことができました。

ですから、文字の場所がわからない場合はどうでしょうか。
あなたと一緒に起動するには、あなたが後にあるのか知っていることを確認するためにあなたのデータを確認する必要があります。 しかし、文字がとてもLOCATEとの仕事をすることができますあなたの文字列の周りに移動することがあります。

私はテストのために別の行を追加します。

root@localhost [test]> insert into forumpost value ('An auditor drives an red audi car');
Query OK, 1 row affected (0.04 sec)

root@localhost [test]> select * from forumpost;
+------------------------------------+
| name |
+------------------------------------+
| An auditor drives an toyota. |
| An auditor drives a volvo. |
| An auditor drives an audi. |
| An auditor drives an audi car |
| An auditor drives an audi blue car |
| An auditor drives an red audi car |
+------------------------------------+ 


だから関係なく、我々は単にその単語をスキップする必要があるように、我々は、監査後に常にそのアウディを見ることができるエンディングの。 ワード監査人は最初の8文字になっているので、それらをスキップします。

root@localhost [test]> SELECT LOCATE('audi', name,8), name FROM forumpost WHERE LOCATE('audi', name,8) > 0 ;
+------------------------+------------------------------------+
| LOCATE('audi', name,8) | name |
+------------------------+------------------------------------+
| 22 | An auditor drives an audi. |
| 22 | An auditor drives an audi car |
| 22 | An auditor drives an audi blue car |
| 26 | An auditor drives an red audi car |
+------------------------+------------------------------------+ 


[OK]をので、我々は後にあるものを見つけました。 今、私たちは、更新ステートメントを記述する必要があります。

我々はこの時間を置き換えることはできません。

UPDATE forumpost SET name = REPLACE(name, LOCATE('audi', name,8), 'mercedes') WHERE LOCATE('audi', name,8) > 0 ;
Query OK, 0 rows affected (0.02 sec)
Rows matched: 4 Changed: 0 Warnings: 0 

それは行を見つけたが、何も変更しなかったことに注意してください。

だから、もう一度試してみて、私は場所8を想定する必要はありません。 私はアウディの2番目の値を求めています。
だからテストはSUBSTRING_INDEXと、私は1日1をスキップして、CONCATを使用できることを示しています

SELECT name , CONCAT ( SUBSTRING_INDEX(name, 'audi', 2) , ' mercedes ' , SUBSTRING_INDEX(name, 'audi', -1) ) as newvalue
FROM forumpost
WHERE LOCATE('audi', name,10) > 0 ;
+-----------------------------------+-----------------------------------------+
| name | newvalue |
+-----------------------------------+-----------------------------------------+
| An auditor drives an audi. | An auditor drives an mercedes . |
| An auditor drives an audi. | An auditor drives an mercedes . |
| An auditor drives an audi car | An auditor drives an mercedes car |
| An auditor drives an red audi car | An auditor drives an red mercedes car |
+-----------------------------------+-----------------------------------------+

root@localhost [test]> UPDATE forumpost SET name = CONCAT(SUBSTRING_INDEX(name, 'audi', 2) , ' mercedes ' , SUBSTRING_INDEX(name, 'audi', -1) )
WHERE LOCATE('audi', name,10) > 0 ;
Query OK, 4 rows affected (0.03 sec)
Rows matched: 4 Changed: 4 Warnings: 0

root@localhost [test]> select * from forumpost;
+-----------------------------------------+
| name |
+-----------------------------------------+
| An auditor drives an mercedes . |
| An auditor drives a volvo. |
| An auditor drives an mercedes . |
| An auditor drives an mercedes car |
| An auditor drives an red mercedes car |
+-----------------------------------------+
5 rows in set (0.00 sec) 


さて、無効であるが、それは別の話です ""の使用と文法を付与した。

これらの詳細については、ここで見つけることができます: