2017-10-19 8 views
0

Je dois obtenir tout avant une chaîne comprenant elle-même et le remplacer par quelque chose d'autre après cela. Par exemple, si j'ai une valeur dans la colonne comme 28/29/81/732536/1496071 alors je veux tout sélectionner avant 81 y compris lui-même, c'est-à-dire je veux 28/29/81 et le remplacer par une autre chaîne. J'ai essayé le ci-dessous, mais je ne reçois que 28/29.obtenir tout avant une chaîne comprenant lui-même oracle

SELECT SUBSTR(eda.ATTRIBUTE_VALUE, 0, INSTR(eda.ATTRIBUTE_VALUE, '81')-2) AS output, ATTRIBUTE_VALUE 
FROM EVENT_DYNAMIC_ATTRIBUTE eda 

enter image description here

+0

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

+0

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

+0

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

Répondre

1

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 
+0

Superbe, parfait !! – user1614862

0

vous pouvez utiliser quelque chose comme ceci:

SELECT 'STRING_TO_REPLACE_WITH' || SUBSTR(eda.ATTRIBUTE_VALUE, INSTR(eda.ATTRIBUTE_VALUE, '81') + 2) AS output 
FROM EVENT_DYNAMIC_ATTRIBUTE eda; 
+0

Cela me donne quelque chose comme ce "STRING_TO_REPLACE_WITH09004" pour une valeur d'attribut "1/63911/1509004", l'identifiant ne serait pas à 2 chiffres tout le temps. – user1614862

+0

J'ai simplement besoin de tout devant un numéro compris lui-même dans le résultat. Le nombre ne doit correspondre qu'à/et /. Fondamentalement, il s'agit du chemin d'ascendance d'une entité, quand il est déplacé vers un autre parent, je voudrais remplacer l'ancien chemin par un nouveau chemin jusqu'à cette entité, afin qu'il ait un chemin correct après le déplacement. – user1614862