0
votes

Comment ajouter des valeurs spécifiques dans une colonne de base de données oracle?

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


4 commentaires

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 devenir kunqwe123 ou kun12qwe3 ?


@jarlh je veux terminer par un chiffre


Encore une fois: et s'il se termine par 3 chiffres?


3 Réponses :


1
votes

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;


1 commentaires

Je pense que le modèle est le suivant: mettez qwe avant le chiffre à la fin.



0
votes

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


0 commentaires

1
votes

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+$')

Démo sur DB Fiddle :

XXX


2 commentaires

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 ).