2017-01-26 4 views
1

Мне нужно выбрать подстроку, чтобы получить последовательный номер из поля таблицы. Моя таблица:Как выбрать SUBSTRING в ORACLE

ORDER_NUM  ORDER_DATE ORDER_TYPE LOCATION SALE_TYPE 
10501702315618 08/01/17  43223  1050  18  
105017023186230 21/01/17  43221  1050  230 

Поле огйег_пит формируется следующим образом

[LOCATION] + [YY] + [CONSECUTIVE_NUMBER] + [SALE_TYPE] 

Длина поля местоположения и SALE_TYPE Может быть different.So, мой запрос:

SELECT 
SUBSTR(ORDER_NUM,LENGTH (ORDER_TYPE) + 3,LENGTH (ORDER_NUM) - LENGTH (SALE_TYPE)), 
ORDER_DATE 
FROM 
CAT_ORDERS 
WHERE 
LOCATION = '1050' 
AND SALE_TYPE = '18' 

Результат

SELECT SUBSTR('10501702315618',7,12) from dual 
    RESULT: 02315618 

Где индексное положение:

123456789
10501702315618 

Как я могу удалить символы SALE_TYPE из строки? Для этого есть еще одна функция?

Thank's!

+0

ли длина CONSECUTIVE_NUMBER исправление или изменение? –

ответ

4

Ваше описание относится к месту, так что это странно, что ваше смещение в зависимости от типа заказа. Длина подстроки необходимо исключить длину места и год, а также:

SUBSTR(ORDER_NUM, LENGTH (LOCATION) + 3, 
    LENGTH (ORDER_NUM) - LENGTH(LOCATION) - 2 - LENGTH (SALE_TYPE)) 

На данный момент вы получаете 12 символов от вашего смещения, когда вы хотите, только шесть, и есть только на самом деле восемь доступных.

Demo с вашими данными:

WITH CAT_ORDERS (ORDER_NUN, ORDER_DATE, ORDER_TYPE, LOCATION, SALE_TYPE) AS (
    SELECT 10501702315618, TO_DATE('08/01/17', 'DD/MM/RR'), 43223, 1050, 18 FROM DUAL 
    UNION ALL SELECT 105017023186230, TO_DATE('21/01/17', 'DD/MM/RR'), 43221, 1050, 230 FROM DUAL 
) 
SELECT SUBSTR(ORDER_NUM, LENGTH (LOCATION) + 3, 
    LENGTH (ORDER_NUM) - LENGTH(LOCATION) - 2 - LENGTH (SALE_TYPE)) 
FROM CAT_ORDERS; 

023156 
023186 

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

+1

Я не могу помочь себе ... Я бы просто написал последний абзац и проигнорировал остальные. Я перейду к нему и изменю его на жирный шрифт (пожалуйста, измените его, если вы не согласны).:-) – mathguy

+0

@mathguy - да, но тогда это было бы NAA * 8-) У меня было это как комментарий, чтобы начать с, но мог бы просто оправдать сжатие его в более широкий ответ ... –

2

Это должно удалить символы sale_type с конца:

select 
    substr(substr(order_num, 0, length(order_num)-length(sale_type)), length(location) + 3) 
from t; 
2
select regexp_substr(ORDER_NUM,'^' || LOCATION || '..(.*)' || SALE_TYPE || '$',1,1,'',1) 
from mytable; 

Так как мы теперь, что длина consecutive_number фиксируется знать (а именно, 6):

select regexp_substr(ORDER_NUM,'^' || LOCATION || '..(.{6})',1,1,'',1) 
from mytable; 

или

select regexp_substr(ORDER_NUM,'(.{6})' || SALE_TYPE || '$',1,1,'',1) 
from mytable; 
+0

Спасибо всем, всем ответы отлично работают. @Dudu Markovitz, последовательное число является фиксированным (6). Thank's –

1

Так как мы теперь, что длина знают от consecutive_number (а именно, 6):

select substr(ORDER_NUM,length(LOCATION)+3,6) 
from mytable; 

или

select substr(ORDER_NUM,-length(SALE_TYPE)-6,6) 
from mytable; 
+0

В этом случае это очень просто. –

+0

@mathguy - Спасибо за редактирование –

+0

Вы проверили его? –