Хитрое использование подстроки - PullRequest
3 голосов
/ 16 ноября 2010

Мой вопрос касается поля с именем contract_nm varchar2 (14).Мне нужно получить 3 различных значения из него, используйте поле, чтобы получить фильтр для предложения where.

Вот пример данных и их длина, 9 или 10 или 11, не более длятеперь это может быть.

CONTRACT_NM               LENGTH(CONTRACT_NM)
F.US.WZ10                          9
F.US.WZ11                          9
F.US.WZ12                          9
F.US.RBZ10                         10
F.US.RBZ11                         10
F.US.RBZ12                         10
F.US.ZWAZ10                     11
F.US.ZWAZ11                     11
F.US.ZWAZ12                     11
etc

1) Мне нужно отобразить последние 3 символа contract_nm.

2) Проверьте последние 3 символа contract_nm, чтобы убедиться, что первая буква однаиз приведенного ниже, то МЕСЯЦ и ГОД будут следующими двумя буквами, а ДЕНЬ будет по умолчанию установлен на первый день месяца.Мне нужно отобразить как дату, потому что она входит в поле даты.

Trade Months (Terms):
F              January                                
G             February                              
H             March                   
J              April                       
K             May
M       June                           
N             July
Q             August
U             September
V             October
X             November
Z       December

3) Это немного сложно объяснить в письменной форме, я постараюсь и надеюсь, что вы меня понимаете !!!Прочитайте данные contract_nm, игнорируйте первые пять символов (F.US.), затем проигнорируйте последние 3 символа, т.е. Z11.Теперь то, с чем мы работаем, это либо 1 символ (длина 9), либо 2 символа (длина 10), либо 3 символа (длина 11) в середине данных, всегда смотрите данные ниже.Если 1 символ, то отображать эту букву, в противном случае - 2 символа, затем проверить 2-ю букву, если не «E», «A» или «T», затем отобразить обе буквы, иначе - только 1-ю букву.Иначе, если 3 символа, затем отобразить первые 2 буквы.

4) Мне нужен фильтр для моего предложения where для чтения данных contract_nm, игнорировать первые пять символов (F.US.), а затем игнорировать последние 3символы т.е. Z11.Теперь то, с чем мы работаем, это либо 1 символ (длина 9), либо 2 символа (длина 10), либо 3 символа (длина 11) в середине данных, всегда смотрите данные ниже.Если 2 символа, то проверьте 2-ю букву, если не «E» или «T», тогда не тяните данные, иначе сделайте это.В противном случае, если 3 символа, затем проверьте 3-ю букву, если не 'E' или 'T', тогда не тяните данные, иначе сделайте это.

Ответы [ 3 ]

5 голосов
/ 16 ноября 2010

Попробуйте следующее:

Вопрос 1:

  contract_nm_month_year := substr(contract_nm, -3);

Вопрос 2:

  contract_date := CASE substr(contract_nm, -3, 1)
                      WHEN 'F' THEN TO_DATE('01-JAN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'G' THEN TO_DATE('01-FEB-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'H' THEN TO_DATE('01-MAR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'J' THEN TO_DATE('01-APR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'K' THEN TO_DATE('01-MAY-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'M' THEN TO_DATE('01-JUN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'N' THEN TO_DATE('01-JUL-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'Q' THEN TO_DATE('01-AUG-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'U' THEN TO_DATE('01-SEP-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'V' THEN TO_DATE('01-OCT-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'X' THEN TO_DATE('01-NOV-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'Z' THEN TO_DATE('01-DEC-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      ELSE NULL;
                    END;

Вопрос 3:

  display_3 := CASE length(contract_nm)
                 WHEN 9 THEN SUBSTR(contract_nm, 6, 1);
                 WHEN 10 THEN
                    CASE SUBSTR(contract_nm, 7, 1)
                      WHEN 'E' THEN SUBSTR(contract_nm, 6, 1);
                      WHEN 'A' THEN SUBSTR(contract_nm, 6, 1);
                      WHEN 'T' THEN SUBSTR(contract_nm, 6, 1);
                      ELSE SUBSTR(contract_nm, 6, 2);
                    END;
                 WHEN 11 THEN SUBSTR(contract_nm, 6, 2)
               END;

Вопрос4:

  WHERE CASE length(contract_nm)
          WHEN 9 THEN 0 -- never pull data for contract length = 9
          WHEN 10 THEN
            CASE SUBSTR(contract_nm, 7, 1)
              WHEN 'E' THEN 1
              WHEN 'T' THEN 1
              ELSE 0
            END
          WHEN 11 THEN
            CASE SUBSTR(contract_nm, 8, 10
              WHEN 'E' THEN 1
              WHEN 'T' THEN 1
              ELSE 0
            END
          ELSE 0
        END = 1;

Делись и наслаждайся.

4 голосов
/ 16 ноября 2010

Сосредоточьтесь на том, как разбить CONTRACT_NM на нужные вам кусочки. Затем создайте представление, чтобы можно было рассматривать каждый фрагмент как столбец. Применение ваших различных условий и преобразований должно быть простым.

Похоже, вы всегда игнорируете первые 5 символов, поэтому просто отрежьте их.

SELECT SUBSTR( contract_nm, 5, LENGTH(contract_nm)-8 ) flags,
       SUBSTR( contract_nm, -3, 1 ) month_flag,
       SUBSTR( contract_nm, -2 ) year
  FROM table

1) month_flag||year.
2)

TO_DATE(
        CASE month_flag WHEN 'F' THEN 'JAN' WHEN 'G' THEN 'FEB' ... END || year,
        'MONRR'
        )

3)

CASE WHEN LENGTH(flags) = 3
          THEN SUBSTR(flags,1,2)
        WHEN LENGTH(flags) = 2 AND SUBSTR(flags,2,1) NOT IN ('E','A','T')
          THEN flags
        ELSE SUBSTR(flags,1,1)

4) Очень похоже на # 3

2 голосов
/ 16 ноября 2010

1) Мне нужно отобразить последние 3 персонажи contract_nm.

Использовать SUBSTR (contract_nm, -3)

Re Q2, используйте выражение CASE что-то вроде:

CASE SUBSTR(contract_nm, -3, 1)
  WHEN 'F' THEN TO_DATE('JAN'||SUBSTR(contract_nm, -2), 'MONRR')
  WHEN 'G' THEN TO_DATE('FEB'||SUBSTR(contract_nm, -2), 'MONRR')
  ...etc.
  END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...