ORACLE SQL для замены / lpadd '-' (или) '_' на ноль (и) в зависимости от длины целого числа после '-' или '_' - PullRequest
0 голосов
/ 05 октября 2018

У меня есть столбец таблицы в oracle db, где значения варьируются как 4123456-1-2-3, 4123456-11-2-3, 4123456-2-221-3, а также QHD-086664-3_9375 и т. Д. Требуется:найти '-' или '_' из значения и заменить / дополнить его нулями в зависимости от длины символа / целого числа после '-' ИЛИ ​​_ _.Это означает, что если длина целого числа после '-'OR' _ 'равна 1, то тогда добавляется 6 нулей, а если длина целого числа после' - 'OR' _ 'равна 2, то к ней добавляется 4 нуля.

4123456-1-2-3     -> 4123456000000100000020000003
4123456-11-2-3    -> 4123456000001100000020000003
4123456-2-221-3   -> 4123456000000200002210000003
QHD-086664-3_9375 -> QHD0086664000000300009375

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я думаю, что самое простое решение - это использование REGEXP_SUBSTR с параметром '[^-_]+':

SELECT (   REGEXP_SUBSTR (val, '[^-_]+', 1, 1)
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 2), 6, '0')
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 3), 6, '0')
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 4), 6, '0'))
  FROM your_table;

На вашем примере данных:

WITH data_example AS (
SELECT '4123456-1-2-3' AS val FROM dual
UNION ALL
SELECT '4123456-11-2-3' AS val FROM dual
UNION ALL
SELECT '4123456-2-221-3' AS val FROM dual
UNION ALL
SELECT 'QHD-086664-3_9375' AS val FROM dual
)
SELECT val,
       (   REGEXP_SUBSTR (val, '[^-_]+', 1, 1)
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 2), 6, '0')
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 3), 6, '0')
        || LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 4), 6, '0')) AS new_val
  FROM data_example;


|  val                |  id                        | 
----------------------------------------------------
|  4123456-1-2-3      |  4123456000001000002000003 |
|  4123456-11-2-3     |  4123456000011000002000003 |
|  4123456-2-221-3    |  4123456000002000221000003 |
|  QHD-086664-3_9375  |  QHD086664000003009375     |

Я надеюсь, что помог!

0 голосов
/ 05 октября 2018

Вот один из способов - он должен работать довольно быстро, так как я не использовал никаких функций регулярных выражений.

with
  sample_data(str) as (
    select '4123456-1-2-3'     from dual union all
    select '4123456-11-2-3'    from dual union all
    select '4123456-2-221-3'   from dual union all
    select 'QHD-086664-3_9375' from dual
  )
-- select * from sample_data; /*
, prep(str, modif) as (
    select str, translate(str, '_', '-')
    from   sample_data
  )
-- select * from prep; /*
, augm(str, modif, pos1, pos2, pos3) as (
    select str, modif, instr(modif, '-', 1, 1),
           instr(modif, '-', 1, 2), instr(modif, '-', 1, 3)
    from   prep
  )
-- select * from augm; /*
select str,
       substr(modif, 1, pos1 - 1) ||
       lpad(substr(modif, pos1 + 1, pos2 - pos1 - 1), 7, '0') ||
       lpad(substr(modif, pos2 + 1, pos3 - pos2 - 1), 7, '0') ||
       lpad(substr(modif, pos3 + 1)                 , 7, '0')    as new_str
from   augm;

STR               NEW_STR                               
----------------- --------------------------------------
4123456-1-2-3     4123456000000100000020000003          
4123456-11-2-3    4123456000001100000020000003          
4123456-2-221-3   4123456000000200002210000003          
QHD-086664-3_9375 QHD008666400000030009375              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...