2017-01-26 38 views
1

我需要選擇一個子字符串以從表字段中獲取連續的數字。我的表是:如何在ORACLE中選擇SUBSTRING

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

領域ORDER_NUM如下

[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人物?還有另一個功能呢?

謝謝!

+0

是CONSECUTIVE_NUMBER長度固定的或變化? –

回答

4

你的描述指的位置,所以它的奇怪的是基於訂單類型,你的偏移量。子字符串的長度需要排除年內還有位置的長度和:

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

在你得到從12個字符的瞬間偏移,當你只想要六個,而且只有真正八個可用。

演示與您的數據:

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)。謝謝 –

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

你有沒有檢查過? –