SQL - 选择位置 10 和位置 20 的字符之间的差异等于 1 的所有条目?

问题描述 投票:0回答:3

我在工厂工作。

我们批量生产。 批次由数字表示,如 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)

sql
3个回答
1
投票
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

0
投票

您可以使用

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

小提琴


0
投票

在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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.