Select 列值长度小于 7 的记录满足条件 - Oracle

Select the records having column value length less than 7 satisfying criteria - Oracle

我有一个包含 NAME 和 CODE 列的 table TABLE1,我有一个包含 NAME、COLUMN1 和 COLUMN2 列的 table TABLE2。我们需要 select 来自 TABLE1 的记录,其 CODE 列值应介于 COLUMN1 和 COLUMN2 列的值之间。

如果CODE值长度大于或等于7那么我们需要检查CODE值的“第七个字符”

a) 如果第七个字符是 D 或 S 则不 select 记录

b) 如果第七个字符不是D或S,则检查CODE列的值是否在TABLE2的COLUMN1和COLUMN2列的值之间,如果是则select记录

如果CODE值长度小于7,那么我们需要检查CODE值是否在COLUMN1和COLUMN2列的值之间。如果是,select 来自 TABLE1 的记录否则不 select

 CREATE TABLE TABLE1 (NAME VARCHAR2(6), CODE VARCHAR2(10));
 
 INSERT INTO TABLE1 VALUES ('JOHN', 'K062');
 INSERT INTO TABLE1 VALUES ('JEFF', 'K08117');
 INSERT INTO TABLE1 VALUES ('KATE', 'K08419');
 INSERT INTO TABLE1 VALUES ('KIWI', 'M991011');
 INSERT INTO TABLE1 VALUES ('TARA', 'S12312D');
 INSERT INTO TABLE1 VALUES ('SOMA', 'T3499XS');
 INSERT INTO TABLE1 VALUES ('RAMA', 'Z043');
 INSERT INTO TABLE1 VALUES ('GEET', '1234567');

 CREATE TABLE TABLE2 (NAME VARCHAR2(6), COLUMN1 VARCHAR2(10), COLUMN2 VARCHAR2(10));
 
 INSERT INTO TABLE2 VALUES ('JOHN', 'K062', 'K062');
 INSERT INTO TABLE2 VALUES ('JEFF', 'K08111', 'K08119');
 INSERT INTO TABLE2 VALUES ('KATE', 'K08419', 'K08419');
 INSERT INTO TABLE2 VALUES ('KIWI', 'M991010', 'M991010');
 INSERT INTO TABLE2 VALUES ('TARA', 'S0000XA', 'S99912S');
 INSERT INTO TABLE2 VALUES ('SOMA', 'T07', 'T3499XS');
 INSERT INTO TABLE2 VALUES ('RAMA', 'Z041', 'Z043');
 INSERT INTO TABLE2 VALUES ('GEET', '1234567', '1234567');

这是我写的查询,

SELECT T1.NAME, T1.CODE
FROM TABLE1 T1
JOIN TABLE2 T2 ON T1.NAME = T2.NAME
WHERE SUBSTR(T1.CODE,7,1) NOT IN ('D', 'S')
AND T1.CODE BETWEEN T2.COLUMN1 AND T2.COLUMN2;

如果我在上面查询,我得到的是其他结果,得到下面结果的查询是什么?

我得到的结果:

 NAME        CODE
 -----------------
 GEET        1234567

结果需要是:

   NAME            CODE
   --------------------
   JOHN            K062
   JEFF            K08117
   KATE            K08419
   RAMA            Z043
   GEET            1234567  

对于代码少于 7 个字符的行,substr 将 return 为空。这导致这些被排除在结果之外。

要包含它们,请进行空检查:

SELECT T1.NAME, T1.CODE
FROM TABLE1 T1
JOIN TABLE2 T2 ON T1.NAME = T2.NAME
WHERE ( 
  SUBSTR(T1.CODE,7,1) NOT IN ('D', 'S') OR  
  SUBSTR(T1.CODE,7,1) IS NULL 
)
AND T1.CODE BETWEEN T2.COLUMN1 AND T2.COLUMN2;

NAME    CODE      
JOHN    K062       
JEFF    K08117     
KATE    K08419     
RAMA    Z043       
GEET    1234567