2012-01-28 17 views
13

私は最近自分のサイトの1つを記録しました。データベースの構造は少し異なります。特定の列の各フィールドから特定のテキストを削除するSQLクエリ?

私は次のように変換しようとしている:次の中へ

*----*----------------------------* 
| id | file_name     | 
*----*----------------------------*  
| 1 | 1288044935741310953434.jpg | 
*----*----------------------------* 
| 2 | 1288044935741310352357.rar | 
*----*----------------------------* 

*----*----------------------------* 
| id | file_name     | 
*----*----------------------------*  
| 1 | 1288044935741310953434  | 
*----*----------------------------* 
| 2 | 1288044935741310352357  | 
*----*----------------------------* 

私はPHPでforeachループを行うことができることを知っている、とオフファイル拡張子を爆発そのように各行を更新しますが、タスクのクエリが多すぎるようです。

file_name列の各フィールドからファイルのエクセンシッションを削除できるSQLクエリはありますか?

答えて

37

ネイティブMySQLでthe REPLACE() functionを使用すると、簡単な文字列の置換を行うことができます。

UPDATE tbl SET file_name = REPLACE(file_name, '.jpg', ''); 
UPDATE tbl SET file_name = REPLACE(file_name, '.rar', ''); 
+1

+1彼のデータにいつか複数の内線番号が含まれている場合、OPは注意が必要です。 – pilcrow

+0

ああ、そう簡単に...美人 – baash05

+2

'some.rare.animal.jpg' - >' somee.animel' carefull;) –

3

これは動作するはずです:

UPDATE MyTable 
SET file_name = SUBSTRING(file_name,1, CHAR_LENGTH(file_name)-4) 
+2

UPDATEを2回実行しないでください... – pilcrow

+0

@pilcrow更新プログラムを2回実行する方法がわかりません! –

+1

right :)しかしOPがこのUPDATEを2回以上実行すると(例えば、その日のレコードを修正する夜間の仕事として)、それはすでに整えられたファイル名の一部を切り捨てます。 – pilcrow

0

をいずれかの場合、これはfile_nameから、それが実行されるたびに、最終的な拡張を取り除きます。拡張に関しては不可知論的なので(あなたはいつか「.foo」を持つことができます)、エクステンションレスのレコードを害することはありません。

UPDATE tbl 
    SET file_name = TRIM(TRAILING CONCAT('.', SUBSTRING_INDEX(file_name, '.', -1) FROM file_name); 
関連する問題