[英]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.