J'ai une table emp comme ci-dessous
id name value 1 a hel 2 b devqwe2 3 c newqwe3 4 d canqwe6 5 e kunqwe8 6 f luvqwe4
je veux ajouter une chaîne dans un emplacement particulier comme ci-dessous pour la colonne de valeur
id name value 1 a hel 2 b dev2 3 c new3 4 d can6 5 e kun8 6 f luv4
s'il vous plaît, aidez-moi tout en sélectionnant la requête
3 Réponses :
UPDATE
, n'est-ce pas?
SQL> WITH emp (id, name, VALUE) 2 AS (SELECT 1, 'a', 'hel' FROM DUAL 3 UNION ALL 4 SELECT 2, 'b', 'dev2' FROM DUAL 5 UNION ALL 6 SELECT 3, 'c', 'new3' FROM DUAL) 7 SELECT id, 8 name, 9 VALUE, 10 CASE 11 WHEN REGEXP_LIKE (VALUE, '\d$') 12 THEN 13 REGEXP_SUBSTR (VALUE, '^[[:alpha:]]+') 14 || 'qwe' 15 || REGEXP_SUBSTR (VALUE, '\d+$') 16 ELSE 17 VALUE 18 END 19 new_value 20 FROM emp; ID N VALU NEW_VALUE ---------- - ---- ----------- 1 a hel hel 2 b dev2 devqwe2 3 c new3 newqwe3 SQL>
Je ne vois aucun modèle qui vous permettrait de le faire automatiquement (ou, du moins, ce n'est pas évident pour moi). S'il y a une règle qui mène de la source à la cible , expliquez-la.
[EDIT, après avoir vu le commentaire de @ a_horse; assez évident, si vous faites attention ...]
update emp set value = case when id = 2 then 'devqwe2' when id = 3 then 'newqwe3' etc. end;
Je pense que le modèle est le suivant: mettez qwe
avant le chiffre à la fin.
Au fur et à mesure que vous avez tagué remplacez
dans la question, je suggère la réponse en conséquence:
SELECT REGEXP_REPLACE (t.value, '^(\w+)(\d+)$', '\1' || 'qwe' || '\2') FROM emp t where regexp_like(t.value, '\d+$');
Mais encore si vous pouvez nous dire le modèle de changement de la règle des valeurs, alors cela peut éviter d'écrire de nombreuses instructions de remplacement
Ou
SELECT REPLACE(t.value, 'dev2', 'devqwe2'), REPLACE(t.value, 'new3', 'newqwe3') etc... FROM emp t
Vous pouvez utiliser regexp_replace ()
pour insérer 'qwe'
juste avant le (s) dernier (s) chiffre (s), le cas échéant:
ID | NAME | VALUE -: | :--- | :------ 1 | a | hel 2 | b | devqwe2 3 | c | newqwe3 4 | d | canqwe6 5 | e | kunqwe8 6 | f | luvqwe4
Si la valeur
se termine par des chiffres, regexp_replace ()
insère 'qwe'
avant les chiffres. Sinon, la valeur
n'est pas modifiée.
Si vous voulez une mise à jour
:
update emp set value = regexp_replace(value, '^(\w+)(\d+)$', '\1' || 'qwe' || '\2') where regexp_like(value, '\d+$')
XXX
J'ajouterais une clause WHERE, pour garder les lignes inchangées hors de la transaction.
@jarlh: oui, il n'était pas clair si OP veut une select
ou une mise à jour
. J'ai ajouté une requête update
à ma réponse (avec une clause where
).
Quelles valeurs mettre à jour? Est-ce une longueur> 3, ou se termine par un chiffre, ou autre chose?
Qu'en est-il d'une valeur de
kun123
qui devrait devenirkunqwe123
oukun12qwe3
?@jarlh je veux terminer par un chiffre
Encore une fois: et s'il se termine par 3 chiffres?