【问题标题】:Select the records having column value length less than 7 satisfying criteria - Oracle选择列值长度小于 7 的记录满足条件 - Oracle
【发布时间】:2021-08-02 00:04:44
【问题描述】:

我有一个包含 NAME & CODE 列的表 TABLE1,我有一个包含 NAME、COLUMN1 和 COLUMN2 列的表 TABLE2。我们需要从 TABLE1 中选择一条 CODE 列值应该介于 COLUMN1 和 COLUMN2 列值之间的记录。

如果CODE值长度大于等于7,则需要检查CODE值的“第七个字符”

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

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

如果 CODE 值长度小于 7,那么我们需要检查 CODE 值是否介于 COLUMN1 和 COLUMN2 列的值之间。如果是,请从 TABLE1 中选择记录,否则不要选择

 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  

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    对于代码少于 7 个字符的行,substr 将返回 null。这会导致这些被排除在结果之外。

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

    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   
    

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 2023-03-28
      • 2019-07-30
      • 2023-03-25
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多