【问题标题】:How Select SUBSTRING in ORACLEORACLE中如何选择SUBSTRING
【发布时间】:2017-06-12 08:11:05
【问题描述】:

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

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 字符?这个还有别的功能吗?

谢谢!

【问题讨论】:

  • CONSECUTIVE_NUMBER 长度是固定的还是变化的?

标签: sql oracle select substring


【解决方案1】:

这应该从末尾删除 sale_type 字符:

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

【讨论】:

    【解决方案2】:

    您的描述指的是位置,因此您的偏移量基于订单类型很奇怪。子串的长度需要排除地点的长度和年份:

    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
    

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

    【讨论】:

    • 我情不自禁...我会只写最后一段而忽略其余部分。我会继续把它改成黑体字(如果你不同意,请改回来)。 :-)
    • @mathguy - 是的,但那将是 NAA *8-) 我把它作为一个评论开始,但可以证明把它压缩成更广泛的答案是合理的......跨度>
    【解决方案3】:
    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;
    

    【讨论】:

    • 感谢大家,所有答案都很完美。 @Dudu Markovitz,连续数字是固定(6)。谢谢
    【解决方案4】:

    既然我们现在知道consecutive_number 的长度是固定的(即6):

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

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

    【讨论】:

    • 这样的话,真的很简单。
    • 你检查了吗?
    猜你喜欢
    • 2018-04-17
    • 2013-10-31
    • 1970-01-01
    • 2020-05-29
    • 2013-09-29
    • 2014-06-19
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多