2012-01-28 80 views
13

我最近重新編寫了一個我的網站,數據庫結構有點不同。SQL查詢從特定列的每個字段中刪除某些文本?

我試圖轉換如下:

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

爲以下:

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

我知道我可以做PHP foreach循環,而爆炸的文件擴展名關閉結束,並以這種方式更新每一行,但這似乎太多查詢任務。

是否有任何SQL查詢,我可以運行,這將允許我從file_name列中的每個字段中刪除文件exentision?

回答

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 2012-01-28 23:04:44

+0

哦,那麼簡單......美女 – baash05 2014-04-03 05:17:20

+2

'some.rare.animal.jpg' - >'somee.animel' carefull;) – 2015-10-09 14:59:12

3

這應該工作:

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

不要運行該更新兩次... – pilcrow 2012-01-28 23:01:49

+0

@pilcrow不會看到它將如何運行更新兩次! – 2012-01-28 23:09:01

+1

right :)但是,如果OP不止一次地運行這個UPDATE(比如說,作爲修復當天記錄的夜間工作),它將會刪除已經修剪過的文件名的部分。 – pilcrow 2012-01-29 14:43:13

0

這將在每次運行時剝去最終延伸,如果有的話,從file_name。關於擴展是不可知的(所以你可以有一天有「.foo」),並且不會傷害無延伸記錄。

UPDATE tbl 
    SET file_name = TRIM(TRAILING CONCAT('.', SUBSTRING_INDEX(file_name, '.', -1) FROM file_name);