2011-06-15 58 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_';