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-)我刚开始只是作为一个评论,但可以证明将它压缩成一个更广泛的答案是合理的。。。