La solution devra travailler lorsque le "jeton" (le '81' dans votre exemple) apparaît entre deux barres obliques , ou juste au début de la chaîne et avant une barre oblique, ou juste après la dernière barre oblique à la fin de la chaîne. Il ne doit pas correspondre si "81" apparaît dans le cadre d'un "token" (entre les barres obliques ou avant le premier ou après le dernier slash). De même, si le "jeton" apparaît plus d'une fois, il ne doit être remplacé (avec tout ce qui précède) qu'une seule fois, et s'il n'apparaît pas du tout, la chaîne d'origine doit rester inchangée.
Si ce sont les règles, alors vous pouvez faire quelque chose comme je montre ci-dessous. Si l'une des règles est différente, la solution peut être modifiée pour s'adapter.
J'ai créé quelques chaînes d'entrée pour tester tous ces cas dans une clause WHERE. J'ai également créé le "jeton de recherche" et le "texte de remplacement" dans une deuxième sous-requête dans la clause WITH. La clause WITH entière doit être remplacée - elle ne fait pas partie de la solution, elle est seulement pour mes propres tests. Dans la requête principale, vous devez utiliser les noms réels des tables et des colonnes (et/ou du texte codé en dur).
J'utilise regexp_replace pour trouver le jeton et le remplacer et tout ce qui vient avant (mais pas la barre oblique après, si elle existe) avec le texte de remplacement. Je dois faire attention à ce slash après le jeton de recherche; J'utilise une référence arrière dans la chaîne de remplacement dans REGEXP_REPLACE à cette fin.
with
event_dynamic_attribute (attribute_value) as (
select '28/29/81/732536/1496071' from dual union all
select '29/33/530813/340042/88' from dual union all
select '81/6883/3902/81/993' from dual union all
select '123/45/6789/81' from dual
),
substitution (token, replacement) as (
select '81', 'mathguy is great' from dual
)
select attribute_value,
regexp_replace (attribute_value, '(^|.*?/)' || token || '(/|$)',
replacement || '\2', 1, 1) new_attrib_value
from event_dynamic_attribute cross join substitution
;
ATTRIBUTE_VALUE NEW_ATTRIB_VALUE
----------------------- ----------------------------------------
28/29/81/732536/1496071 mathguy is great/732536/1496071
29/33/530813/340042/88 29/33/530813/340042/88
81/6883/3902/81/993 mathguy is great/6883/3902/81/993
123/45/6789/81 mathguy is great
De toute évidence, vous devez augmenter le troisième argument - changer '-2' à' + 1' ou plus. Vous aurez cependant des problèmes si la chaîne '' 81 '' n'est pas présente dans l'entrée. Alors: Voulez-vous vraiment faire correspondre ''/ 81 /'', et pas le '81' dans' '/ 19812 /' '? – mathguy
le 81 pourrait être n'importe quel nombre entre/et /, c.-à-d. 81 ou 3543, 543545 quelque chose, dans ma requête que la chaîne correspondante vient d'un paramètre – user1614862
Vous n'avez pas compris ma question. Si la valeur_attribut est '28/29/81/732536', cela correspond-il' 253'? C'est une sous-chaîne de '732536' - est-ce suffisant pour former une correspondance? – mathguy