Sql ORACLE中如何选择子字符串

Sql ORACLE中如何选择子字符串,sql,oracle,select,substring,Sql,Oracle,Select,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] +

我需要选择一个子字符串以从表字段中获取连续数字。我的桌子是:

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]
位置和销售类型字段的长度可以不同,所以我的查询是:

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_类型字符:

select 
  substr(substr(order_num, 0, length(order_num)-length(sale_type)), length(location) + 3)
from t;

这将从末尾删除sale_类型字符:

select 
  substr(substr(order_num, 0, length(order_num)-length(sale_type)), length(location) + 3)
from t;

您的描述提到了位置,所以奇怪的是您的偏移量是基于订单类型的。子字符串的长度需要排除位置和年份的长度:

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


您的订单号与其他列的数据重复,这似乎并不理想。只存储“连续编号”部分会更简单,并将完整订单号生成为虚拟列。

您的描述引用了位置,因此奇怪的是,您的偏移量是基于订单类型的。子字符串的长度需要排除位置和年份的长度:

SUBSTR(ORDER_NUM, LENGTH (LOCATION) + 3,
  LENGTH (ORDER_NUM) - LENGTH(LOCATION) - 2 - LENGTH (SALE_TYPE))
select  regexp_substr(ORDER_NUM,'^' || LOCATION || '..(.*)' || SALE_TYPE || '$',1,1,'',1)
from    mytable;
目前,偏移量中有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

您的订单号与其他列的数据重复,这似乎并不理想。更简单的做法是只存储“连续编号”部分,并将完整订单编号生成为虚拟列。

select  regexp_substr(ORDER_NUM,'^' || LOCATION || '..(.*)' || SALE_TYPE || '$',1,1,'',1)
from    mytable;


因为我们现在知道,
连续_数
的长度是固定的(即6):



因为我们现在知道,
连续_数
的长度是固定的(即6):


因为我们现在知道,
连续_数
的长度是固定的(即6):


因为我们现在知道,
连续_数
的长度是固定的(即6):


连续数字长度是固定的还是变化的?连续数字长度是固定的还是变化的?感谢大家,所有的答案都很完美@Dudu Markovitz,连续的数字是fix(6)。谢谢大家,所有的答案都很完美@Dudu Markovitz,连续的数字是fix(6)。谢谢,在那种情况下,它真的很简单。你检查过了吗?在那种情况下,它真的很简单。你检查过了吗?我忍不住。。。我会只写最后一段,而忽略其余部分。我将继续并将其改为黑体(如果您不同意,请将其改回)。:-)@mathguy-是的,但那应该是NAA*8-)我刚开始只是作为一个评论,但可以证明把它压缩成一个更广泛的答案是合理的…我无法控制自己。。。我会只写最后一段,而忽略其余部分。我将继续并将其改为黑体(如果您不同意,请将其改回)。:-)@mathguy-是的,但那应该是NAA*8-)我刚开始只是作为一个评论,但可以证明将它压缩成一个更广泛的答案是合理的。。。