Найти определенное слово в строке, вернуть предыдущие 4 символа из начала слова - PullRequest
0 голосов
/ 29 января 2019

Мне нужно добавить вычисляемое поле, чтобы найти слово «Месяц» в строке, а затем вернуть непосредственно предшествующие числовые символы.

поле, на котором необходимо выполнить эту оценку, равно FIELD12.

В этом поле может быть много форматов строк.Важно то, что когда появится слово «месяц», ему будет предшествовать как минимум 1 цифровая цифра.

например,

  • 6 месяцев Акция
  • 12.99% для120 месяцев
  • Сокращено на 12 месяцев

и т. Д.

Код ниже в настоящее время работает нормально.Я удалил конфиденциальную информацию.

SELECT  SAMPLETABLE.CRED_CARD_ID  
    , SAMPLETABLE.LN_ORIG_DT  
    , SAMPLETABLE.ACCT_STAT_DESC  
    , SAMPLETABLE.CURR_BAL_AMT  
    , SAMPLETABLE.TRM_MTH_NBR  
    , SAMPLETABLE.PROMO_END_DT  
    , SAMPLETABLE.PURCH_WNDW_END_DT  
    , SAMPLETABLE.PROMO_TRM_TXT  
    , SAMPLETABLE.FIELD12

FROM 
    DB.SAMPLETABLE SAMPLETABLE
    INNER JOIN
    (SELECT  MAX(SAMPLETABLE_1.BI_DATA_AS_OF_DT) AS AS_OF_DT
    FROM DB.SAMPLETABLE SAMPLETABLE_1) Subquery
    ON (SAMPLETABLE.BI_DATA_AS_OF_DT = Subquery.AS_OF_DT) 
WHERE (SAMPLETABLE.ACCT_STAT_DESC = 'Open')

Ответы [ 5 ]

0 голосов
/ 29 января 2019

Спасибо @ Марк-Баринштейн !!!Приведенный ниже оператор работает отлично.

xmlcast (xmlquery ('let $ r: = fn: replace ($ s, ". * (\ D +) + month. *", "$ 1", "i")вернуть if ($ r, преобразуемый как xs: integer), затем xs: integer ($ r) else () 'передача' || SAMPLETABLE.FIELD12 как "s") как int) как число

0 голосов
/ 29 января 2019

Подавить случай, когда индекс отрицательный, чтобы исправить ошибку за пределами границ

select 
SUBSTR(FIELD12,LOCATE('Month', FIELD12),-4)
from mytable

where LOCATE('Month', FIELD12) > 4
0 голосов
/ 29 января 2019

Пример регулярных выражений DB2.

select 
  t.FIELD12
, xmlcast(xmlquery('let $r := fn:replace($s, ".* (\d+) +month.*", "$1", "i") return if ($r castable as xs:integer) then xs:integer($r) else ()' passing ' '||t.FIELD12 as "s") as int) number
from table (values
  '4.99% for 6 Months until End'
, 'Equal Payments for 120 months'
, 'Equal Payments for 24 months'
, '1 month'
, 'wrong string'
, 'unknown number of months'
) t (FIELD12);

Результат:

FIELD12                         NUMBER
----------------------------    ------
4.99% for 6 Months until End         6
Equal Payments for 120 months      120
Equal Payments for 24 months        24
1 month                              1
wrong string                         -
unknown number of months             -

В вашем случае должно быть что-то вроде этого:

SELECT  SAMPLETABLE.CRED_CARD_ID  
    , SAMPLETABLE.LN_ORIG_DT  
    , SAMPLETABLE.ACCT_STAT_DESC  
    , SAMPLETABLE.CURR_BAL_AMT  
    , SAMPLETABLE.TRM_MTH_NBR  
    , SAMPLETABLE.PROMO_END_DT  
    , SAMPLETABLE.PURCH_WNDW_END_DT  
    , SAMPLETABLE.PROMO_TRM_TXT  
    , SAMPLETABLE.FIELD12
    , xmlcast(xmlquery('let $r := fn:replace($s, ".* (\d+) +month.*", "$1", "i") return if ($r castable as xs:integer) then xs:integer($r) else ()' passing ' '||SAMPLETABLE.FIELD12 as "s") as int) as number
FROM 
    DB.SAMPLETABLE SAMPLETABLE
    INNER JOIN
    (SELECT  MAX(SAMPLETABLE_1.BI_DATA_AS_OF_DT) AS AS_OF_DT
    FROM DB.SAMPLETABLE SAMPLETABLE_1) Subquery
    ON (SAMPLETABLE.BI_DATA_AS_OF_DT = Subquery.AS_OF_DT) 
WHERE (SAMPLETABLE.ACCT_STAT_DESC = 'Open');

fn: replace функция принимает ваш SAMPLETABLE.FIELD12 в качестве 1-го параметра.2-й параметр - это шаблон регулярного выражения, с которым сравнивается переданное значение столбца.Значение шаблона .* (\d+) +month.* подэлементов:

.* - ноль или более любых символов

- один пробел

(\d+) - одинили больше цифр;мы окружаем их (), чтобы ссылаться на него позже

+ - один или несколько пробелов

month - строковая константа

.* - ноль или болеелюбые символы

Если значение столбца соответствует этому шаблону, все значение заменяется на 1-е (и единственное) значение группы (в шаблоне, окруженное (), мы ссылаемся на это $1в 3-м параметре функции).Если нет, то значение столбца остается неизменным.Наконец, мы пытаемся привести замененное значение к int, используя выражение xpath.Возвращает NULL, если такое приведение неудачно.

0 голосов
/ 29 января 2019

Если ваша версия Db2 поддерживает функции REGEXP (например, если на Db2 11.1 для LUW), вы найдете REGEXP_SUBSTR https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r0061497.html более гибким.Например,

SELECT 
  T.FIELD12
, REGEXP_SUBSTR(FIELD12,'(\d{1,4})\s+month',1,1,'i',1) AS REGEX_SOLUTION
, SUBSTR(FIELD12,NULLIF(LOCATE('months',lower(FIELD12)),0)-4,4) AS SUBSTR_SOLUTION
FROM TABLE (VALUES
  '4.99% for 6 Months until End'
, 'Equal Payments for 120 months adn 12 months'
, 'Equal Payments for 24 months'
, '1 month'
, 'wrong string'
, 'unknown number of months'
) T (FIELD12);

дает

 FIELD12                                        REGEX_SOLUTION  SUBSTR_SOLUTION
 -------------------------------------------    --------------  ---------------
 4.99% for 6 Months until End                   6               r 6 
 Equal Payments for 120 months adn 12 months    120             120 
 Equal Payments for 24 months                   24               24 
 1 month                                        1               NuLL
 wrong string                                   NuLL            NuLL
 unknown number of months                       NuLL             of 
0 голосов
/ 29 января 2019

Я часто решаю эту проблему, просто добавляя 'Month' в конец строки.Скорее всего, вам нужно выражение case:

select (case when Field12 like '%Month%' then SUBSTR(FIELD12, LOCATE('Month', FIELD12), -4) end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...