Совместное использование INSTR и SUBSTR - PullRequest
0 голосов
/ 29 ноября 2010

Сначала посмотрите нижеприведенные данные, мне нужно вычислить столбцы HUB_NM, PRODUCT_NM и STRIP_NM из первых 2 столбцов, как описано.

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

Я не могу понять, как это сделать.Я знаю, что должен использовать SUBSTR и INSTR, но не могу понять.

A) Как получить значение столбца HUB_NM из 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) Как получить столбец PRODUCT_NMзначение из 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) Как получить значение столбца STRIP_NM из 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 Ответ

0 голосов
/ 29 ноября 2010

Давайте начнем добавлять некоторые инструкции для создания примера данных.

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');

Конечно, вам нужно проделать большую работу, чтобы выяснить, как будут выглядеть результаты instr и substr. Более того, вы никогда не поймете это, просто подумав или записав тонны скобок.

Мой совет - написать временную инструкцию выбора с частичными результатами, например:

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

Обратите внимание, что столбец RESULT создан с использованием тех же выражений, что и столбцы string_start и string_length.

Это также отвечает на вопрос A

Это даст вам начальные результаты, так что вы сможете выяснить, что произойдет внутри выражения. Затем поместите все в инструкцию DECODE

Пример 2:

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

Наконец, чтобы удалить 9 символов до конца работы, используйте функцию ДЛИНА

Пример 3:

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

Примите извинения за невозможность проверить код Oracle на реальном компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...