2010-11-29 4 views
0

Voir ci-dessous les données ci-dessous d'abord, j'ai besoin de calculer les colonnes HUB_NM, PRODUCT_NM et STRIP_NM à partir des 2 premières colonnes comme décrit.En utilisant INSTR et SUBSTR ensemble

DEAL_ORIGINATION EXCH_SYMBOL         HUB_NM  PRODUCT_NM   STRIP_NM 
---------------- ---------------------------------------------- ---------- --------------------- ------------ 
TT_ICE   IPE e-Gas Oil DEC 2010         IPE e-Gas Oil   DEC 2010 
GLOBEX   HO DEC 2010            HO     DEC 2010 
ICE NG   Firm Phys, ID, GDD - Transco-45 - Next Day Gas Transco-45 NG Firm Phys, ID, GDD Next Day Gas 
STUSCO_ICE  Brent Crude Futures - North Sea - Dec12     Brent Crude Futures DEC12 

Je n'arrive pas à comprendre comment procéder. Je sais que je devrais utiliser SUBSTR et INSTR mais je ne peux pas le comprendre.

A) Comment obtenir la valeur de colonne HUB_NM de EXCH_SYMBOL?

If T.DEAL_ORIGINATION = 'ICE' 
then 
    Find 1st space dash space 
    Find 2nd space dash space 
    Display the word in between, no space at the end 
elsif T.DEAL_ORIGINATION in ('GLOBEX', 'TT_ICE', 'STUSCO_ICE') 
then 
    null; 
end if; 

B) Comment obtenir la valeur de colonne PRODUCT_NM de EXCH_SYMBOL?

If T.DEAL_ORIGINATION in ('ICE', 'STUSCO_ICE') 
then 
    Display from 1st character to the 1st dash, no space at the end 
elsif T.DEAL_ORIGINATION in ('GLOBEX', 'TT_ICE',) 
then 
    Remove -9 caharacters from the end of the word and display the fornt word, no space at the end 
end if; 

C) Comment obtenir la valeur de colonne STRIP_NM de EXCH_SYMBOL?

If T.DEAL_ORIGINATION in ('ICE', 'STUSCO_ICE') 
then 
    Find the 2nd space dash space 
    Display from then on to the end of the word, no space at the end 
elsif T.DEAL_ORIGINATION in ('GLOBEX', 'TT_ICE',) 
then 
    Display the last -8 caharacters from the end of the word, no space at the end 
end if; 
+1

pourriez-vous fournir un exemple de table avec des inserts pour la table ou un CTE? Je ne peux pas faire la tête ou la queue hors des données d'échantillon. – Harrison

+0

une demande de plus, pourriez-vous mettre dans les exemples dans A, B, C de votre sortie prévue? et quelle version d'Oracle utilisez-vous (êtes-vous opposé à une réponse d'expression régulière? REGEXP_SUBSTR & regexp_replace peut être la réponse que vous cherchez – Harrison

Répondre

0

Commençons à ajouter des instructions pour créer un exemple de données.

CREATE TABLE mytab 
( 
DEAL_ORIGINATION VARCHAR2(100), 
EXCH_SYMBOL VARCHAR2(100), 
HUB_NM VARCHAR2(100), 
PRODUCT_NM VARCHAR2(100), 
STRIP_NM VARCHAR2(100) 
); 

INSERT INTO mytab (DEAL_ORIGINATION, EXCH_SYMBOL, HUB_NM, PRODUCT_NM, STRIP_NM) 
VALUES ('TT_ICE', 'IPE e-Gas Oil DEC 2010', null, 'IPE e-Gas Oil', 'DEC 2010'); 

INSERT INTO mytab (DEAL_ORIGINATION, EXCH_SYMBOL, HUB_NM, PRODUCT_NM, STRIP_NM) 
VALUES ('GLOBEX', 'HO DEC 2010',null, 'HO', 'DEC 2010'); 

INSERT INTO mytab (DEAL_ORIGINATION, EXCH_SYMBOL, HUB_NM, PRODUCT_NM, STRIP_NM) 
VALUES ('ICE NG','Firm Phys, ID, GDD - Transco-45 - NEXT DAY Gas', 'Transco-45', 'NG Firm Phys, ID, GDD', 'NEXT DAY Gas'); 
INSERT INTO mytab (DEAL_ORIGINATION, EXCH_SYMBOL, HUB_NM, PRODUCT_NM, STRIP_NM) 
VALUES ('STUSCO_ICE', 'Brent Crude Futures - North Sea - Dec12', null, 'Brent Crude Futures', 'DEC12'); 

Bien sûr, vous devez faire beaucoup de travail pour déterminer comment les résultats instr et substr seront. De plus, vous ne le comprendrez jamais en pensant ou en écrivant des tonnes de parenthèses.

Mon conseil est d'écrire une instruction select temporaire avec des résultats partiels, comme ce qui suit:

SELECT deal_origination, exch_symbol, 
     INSTR(exch_symbol,' - ')+3 as string_start, 
     INSTR(SUBSTR(EXCH_SYMBOL,INSTR(exch_symbol,' - ')+3) , ' - ')-1 string_length , 
     SUBSTR(exch_symbol, INSTR(exch_symbol,' - ')+3, INSTR(SUBSTR(EXCH_SYMBOL,INSTR(exch_symbol,' - ')+3) , ' - ')-1) as RESULT 
FROM mytab 

S'il vous plaît noter que la colonne est faite en utilisant les mêmes expressions que les colonnes de string_start et string_length.

Cela répond également à la question A

Cela vous donnera les premiers résultats, de sorte que vous serez en mesure de comprendre ce qui va se passer dans l'expression. Ensuite, mettez tout dans une instruction DECODE

Exemple 2:

decode (DEAL_ORIGINATION, 
    'ICE', 'results in case of ICE', 
    'GLOBEX', 'results in case of GLOBEX', 
    null) 
-- the last null is the default condition 

Enfin pour supprimer 9 caractères à la fin d'un travail utilisez la fonction LONGUEUR

Exemple 3:

-- this removes the last 6 characters from the hello world string 
select substr ('hello world', 1, length('hello world) - 6) 

Accepter des excuses pour être incapable de tester le code Oracle sur une machine réelle.

Questions connexes