我在工厂工作。
我们批量生产。 批次由数字表示,如 1000585855;每个批次的最后 6 位数字都是唯一的。
制造的第一阶段涉及同时加工两批产品。
一般来说,批次的区别只是最后一位数字大+1。 因此,对于批次 1000585855,“姐妹批次”将为 1000585856。 (当我们引用数据库中正在处理的这些批次时,它们被引用为 1000585855_000585856。)
然而,有时,姊妹批次可能会大+2或+3(实际上它可以是+任何自然数)。 例如,我看到了 1000456872_0000456874。
与批次相关的信息存储在 Oracle 数据库表中。 数据库表的结构如下:
BATCH_ID |
---|
1000731655_000731656 |
1000746832_000746833 |
1000731637_000731639 |
1000575235_000575236 |
是否可以构建一个查询,仅当第 10 个和第 20 个字符(粗体)之间的差异大于 1 时,我才能获取 BATCH_ID?
因此,如果我要在上面的示例表中使用这样的查询,则返回的唯一 BATCH_ID 应该是 1000731637_9。 (9 减 7 = 2)
WITH -- S a m p l e D a t a :
tbl (EQUIPMENT_ID, BATCH_ID) AS
(
Select 'Dispense', '1000731655_000731656' From Dual Union All
Select 'Dispense', '1000746832_000746833' From Dual Union All
Select 'Dispense', '1000731637_000731639' From Dual Union All
Select 'Dispense', '1000575235_000575236' From Dual
)
-- M a i n S Q L :
SELECT EQUIPMENT_ID, BATCH_ID
FROM tbl
WHERE To_Number(SubStr(BATCH_ID, 20, 1)) - To_Number(SubStr(BATCH_ID, 10, 1)) > 1
--
-- R e s u l t :
-- EQUIPMENT_ID BATCH_ID
-- ------------ --------------------
-- Dispense 1000731637_000731639
也许最好将第 9 和 10 号等两个字符与 19 号和 20 号一起使用,因为以 0 结尾的数字可能会出现一些问题。使用 To_number() 因为我不喜欢依赖于隐式转换。
WHERE To_Number(SubStr(BATCH_ID, 19, 2)) - To_Number(SubStr(BATCH_ID, 9, 2)) > 1
您可以使用
SUBSTR
查找这些位置的字符,然后减去(隐式将它们转换为数字):
SELECT *
FROM table_name
WHERE ABS(SUBSTR(batch_id, 20, 1) - SUBSTR(batch_id, 10, 1)) > 1;
对于样本数据:
CREATE TABLE table_name (EQUIPMENT_ID, BATCH_ID) AS
SELECT 'Dispense', '1000731655_000731656' FROM DUAL UNION ALL
SELECT 'Dispense', '1000746832_000746833' FROM DUAL UNION ALL
SELECT 'Dispense', '1000731637_000731639' FROM DUAL UNION ALL
SELECT 'Dispense', '1000575235_000575236' FROM DUAL UNION ALL
SELECT 'Dispense', '1000575239_000575240' FROM DUAL;
输出:
设备_ID | BATCH_ID |
---|---|
分配 | 1000731637_000731639 |
分配 | 1000575239_000575240 |
或者,如果您想使用全部 6 位数字,则:
SELECT *
FROM table_name
WHERE ABS(SUBSTR(batch_id, 15, 6) - SUBSTR(batch_id, 5, 6)) > 1;
哪个输出:
设备_ID | BATCH_ID |
---|---|
分配 | 1000731637_000731639 |
在xase中,数字不是固定长度的,你可以尝试
CREATE TABLE batch
("EQUIPMENT_ID" varchar2(8), "BATCH_ID" varchar2(20))
;
INSERT ALL
INTO batch ("EQUIPMENT_ID", "BATCH_ID")
VALUES ('Dispense', '1000731655_000731656')
INTO batch ("EQUIPMENT_ID", "BATCH_ID")
VALUES ('Dispense', '1000746832_000746833')
INTO batch ("EQUIPMENT_ID", "BATCH_ID")
VALUES ('Dispense', '1000731637_000731639')
INTO batch ("EQUIPMENT_ID", "BATCH_ID")
VALUES ('Dispense', '1000575235_000575236')
SELECT * FROM dual
4 rows affected
SELECT * FROM batch t
WHERE To_Number(SUBSTR(SUBSTR(t."BATCH_ID", INSTR(t."BATCH_ID", '_')+1),-1))
- To_Number(SUBSTR(SUBSTR(t."BATCH_ID", 1, INSTR(t."BATCH_ID", '_')-1),-1))
> 1
设备_ID | BATCH_ID |
---|---|
分配 | 1000731637_000731639 |