2011-06-15 4 views
2

J'ai table comme ceci:Mise à jour SQL - Modification d'une chaîne

Users(id,name) 

je besoin d'une requête pour trouver le début de nom avec « asdf_ » et mettre à jour toutes les lignes avec la suppression de ce préfixe.

par exemple:

Avant requête, la table contient:

asdf_john 
asdf_jane 

Après requête Je veux:

john 
jane 

Merci pour l'aide

Répondre

6

La fonction SQL que vous pouvez utiliser est Substring: SUBSTR (Exemple: http://www.1keydata.com/sql/sql-substring.html)

pour votre table UTILISATEURS:

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

+1 La seule bonne réponse. –

+1

Ce n'est pas tout à fait correct car la chaîne à remplacer peut avoir une longueur variable (par exemple si elle est passée en argument à une fonction) – manji

+1

@Manji: ok mais vous pouvez utiliser la longueur de la fonction pour résoudre la longueur de la chaîne – McPepper

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

Ajouté leClausebasée sur la réponse de @ UltraCommit, donc elle remplace quand elle trouve la chaîne au début.

OU en fonction de la réponse de @ McPepper:

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

Si vous voulez remplacer uniquement lorsque la chaîne est au début. Remplacez le nombre 6 par le nombre de caractères la chaîne que vous souhaitez remplacer a + 1. Dans ce cas votre chaîne asdf_ est 5 caractères, +1 devient 6. C'est la position du caractère où la BD commencera à garder la chaîne.

+1

C'est toujours faux. Que faire si la phrase est trouvée au début * et * au milieu? –

+1

@UltraCommit: Essayez de ne pas être si surpris;) –

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

Dans Oracle PL/SQL, le trait de soulignement signifie un seul caractère jolly, de sorte que vous allez remplacer les chaînes commençant par asdf1, asdf2, asdf3, ......, asdfZ et bientôt. – UltraCommit

+2

@UltraCommit: C'est bien, mais la question est étiquetée 'mysql'. –

+0

Mais il est également étiqueté génériquement avec SQL et QUERY, donc si je déclare que l'environnement PL ORACLE PL/SQL a un effet différent, je ne me trompe pas. – UltraCommit

0

Cela devrait fonctionner en supprimant le départ "asdf_" seulement de tous les noms commençant par "asdf_"

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