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

az31mfrm  于 2023-06-22  发布在  Oracle
关注(0)|答案(3)|浏览(72)

我在一家制造电子传感器的工厂工作。
我们批量生产传感器(一批有10,000个传感器)。批次编号为1000585855;最后6位数字对于每个批次是唯一的。
然而,制造传感器的第一阶段(在称为Dispense的机器上)涉及一起处理两个批次。
通常,批次的区别仅在于最后一位数字大+1。因此,对于批次1000585855,“姊妹批次”将为1000585856。(当我们在数据库中引用这些正在分配的批次时,将其引用为1000585855_000585856。)
然而,有时候,姐妹组可能会大于+2或+3(实际上它可以是+任何自然数)。例如,我看到1000456872_0000456874
与批处理相关的信息存储在Oracle数据库表中。该表称为EM_EQUIPMENT_LG表,其结构如下:
| 设备ID|批次ID|
| - -----|- -----|
| 分发|1000731655_000731656|
| 分发|1000746832_000746833|
| 分发|1000731637_000731639|
| 分发|1000575235_000575236|
是否可以构造一个查询,仅当第10个字符和第20个字符(粗体)之间的差值大于1时,才获得BATCH_ID?
因此,如果我在上面的示例表中使用这样的查询,则返回的唯一BATCH_ID应该是1000731637_9。(9减7 = 2)

myzjeezk

myzjeezk1#

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
ffvjumwh

ffvjumwh2#

您可以使用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|批次ID|
| - -----|- -----|
| 分发|1000731637_000731639|
| 分发|1000575239_000575240|
或者,如果您想使用所有6位数字,则:

SELECT *
FROM   table_name
WHERE  ABS(SUBSTR(batch_id, 15, 6) - SUBSTR(batch_id, 5, 6)) > 1;

其输出:
| 设备ID|批次ID|
| - -----|- -----|
| 分发|1000731637_000731639|
fiddle

dz6r00yl

dz6r00yl3#

如果数字不是固定长度的,你可以试试

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|批次ID|
| - -----|- -----|
| 分发|1000731637_000731639|
fiddle

相关问题