2011-06-15 62 views
2

我的表是這樣的:SQL更新 - 更改字符串

Users(id,name) 

我需要一個查詢,以查找姓名的開始與「asdf_」,除去所這個前綴更新所有行。

例如:

查詢之前,該表包含:

asdf_john 
asdf_jane 

查詢後,我想:

john 
jane 

感謝您的幫助

回答

6

,你可以使用SQL函數是字符串:SUBSTR(例如:http://www.1keydata.com/sql/sql-substring.html

對於你的表USERS:

UPDATE USERS SET NAME = SUBSTRING (NAME, 6) WHERE NAME LIKE 'asdf_%'; 
+1

+1唯一正確的答案。 – 2011-06-15 15:28:04

+1

這是不完全正確,因爲替換字符串可以具有可變長度 – manji 2011-06-15 15:44:56

+1

@Manji(例如,如果作爲參數傳遞給函數):確定,但比你可以使用函數長度來解決字符串的長度,以取代 – McPepper 2011-06-15 15:49:55

0
UPDATE `Users` SET `name` = replace(`name`, 'asdf_', '') WHERE `name` LIKE 'asdf\_%' ESCAPE '\'; 

添加了WHERE子句基於@ UltraCommit的答案,所以它會在開始時找到字符串時進行替換。

或者基於在@ McPepper的回答是:

UPDATE `Users` SET `name` = SUBSTRING(`name`, 6) WHERE `name` LIKE 'asdf\_%' ESCAPE '\'; 

如果你想更換,只有當該字符串的開頭。將數字6替換爲您要替換的字符串的字符數+ 1。 在這種情況下,您的字符串asdf_5字符長,+1變得6。這是數據庫將開始保存字符串的字符位置。

+1

這仍然是錯誤的。如果在開頭*和*在中間找到該短語會怎麼樣? – 2011-06-15 15:27:40

+1

@UltraCommit:儘量不要採取行動,以便驚訝;) – 2011-06-15 15:34:06

1
Update Users 
set name = trim(leading 'asdf_' from name) 
where name like 'asdf_%' 
+0

在Oracle PL/SQL,下劃線意味着一個快樂的性格,所以你會替換字符串與asdf1,asdf2,asdf3,......,asdfZ並開始等等。 – UltraCommit 2011-06-15 15:19:21

+2

@UltraCommit:這很好,但問題是標籤爲'mysql'。 – 2011-06-15 15:26:54

+0

但是,也是一般用SQL和QUERY標記,所以如果我聲明IN ORACLE PL/SQL環境有不同的效果,我沒有錯。 – UltraCommit 2011-06-15 15:28:22

0

這應該通過刪除啓動 「asdf_」 只工作以「asdf_」開頭的所有名稱

UPDATE `Users` 
SET `name` = SUBSTRING(`name`, 6) 
WHERE `name` REGEXP '^asdf_';