[英]How Select SUBSTRING in ORACLE
我需要選擇一個subtring才能從表字段中獲取連續的數字。 我的桌子是:
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]
LOCATION和SALE_TYPE字段的長度可以不同。因此,我的查詢是:
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
索引位置在哪里:
12345678901234
10501702315618
我如何從字符串中刪除SALE_TYPE字符? 還有另一個功能嗎?
謝謝!
您的描述是針對位置的,因此您的抵消額是基於訂單類型的,這很奇怪。 子字符串的長度也需要排除位置的長度和年份:
SUBSTR(ORDER_NUM, LENGTH (LOCATION) + 3,
LENGTH (ORDER_NUM) - LENGTH(LOCATION) - 2 - LENGTH (SALE_TYPE))
目前,您將從偏移量中獲取12個字符,而當您只需要6個字符時,實際上只有8個可用字符。
演示數據:
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
您的訂單號重復了其他列中的數據,這似乎並不理想。 僅存儲“連續編號”部分,並生成完整的訂單編號作為虛擬列會更簡單。
這應該從最后刪除sale_type字符:
select
substr(substr(order_num, 0, length(order_num)-length(sale_type)), length(location) + 3)
from t;
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;
既然我們知道consecutive_number
的長度是固定的(即6):
select substr(ORDER_NUM,length(LOCATION)+3,6)
from mytable;
要么
select substr(ORDER_NUM,-length(SALE_TYPE)-6,6)
from mytable;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.