字段CHAR上的Oracle JOIN 2表具有不同的大小

nhn9ugyo  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(122)

我有一个使用Oracle 19.1.0的外部软件,其中我们有2个表,我想加入。在一个表中,一个连接字段是CHAR(15),另一个是CHAR(36)。我知道在第二个表中,该字段在末尾(位置15之后)填充了空白。
当我尝试以这种方式执行查询时,它不会返回任何行:

SELECT C30.C30_FILIAL FILIAL,
        C30.C30_CHVNF CHVNF,
        C30.C30_NUMITE NUMITE,
        C30.C30_CODITE CODITE,
        C30.C30_TPREPA TPREPA,
        C30.C30_IDTSER IDTSER,
        C30.C30_SRVMUN SRVMUN,
        C30.C30_CODSER CODSER 
    FROM TSC00_1568128481 C20 
        INNER JOIN C30010 C30 
            ON C30.C30_CHVNF = C20.CHVNF
                AND C30.C30_FILIAL = C20.FILIAL 
                AND C30.D_E_L_E_T_ =' '

字符串
但是当我尝试使用RTRIM时,它可以按预期返回几行:

SELECT C30.C30_FILIAL FILIAL,
        C30.C30_CHVNF CHVNF,
        C30.C30_NUMITE NUMITE,
        C30.C30_CODITE CODITE,
        C30.C30_TPREPA TPREPA,
        C30.C30_IDTSER IDTSER,
        C30.C30_SRVMUN SRVMUN,
        C30.C30_CODSER CODSER 
    FROM TSC00_1568128481 C20 
        INNER JOIN C30010 C30 
            ON C30.C30_CHVNF = RTRIM(C20.CHVNF)
                AND C30.C30_FILIAL = C20.FILIAL 
                AND C30.D_E_L_E_T_ =' '


C30010.C30_CHVNFCHAR(15)C20.CHVNFCHAR(36)。我没有权限重写查询。
Execution plan
有没有什么参数可以控制它?

mspsb9vt

mspsb9vt1#

可以在TSC00_1568128481上创建一个基于函数的索引,如下所示:

create index TSC00_1568128481_inf on TSC00_1568128481(RTRIM(CHVNF));

字符串
尽管如此,我认为最好更新该列,以便在末尾不再包含空格,并添加约束检查(CHVNF=RTRIM(CHVNF)),并且为了防止由约束引起的问题,在更新每行之前创建一个触发器,将rtrim应用于该列。

yizd12fk

yizd12fk2#

根据文档,Oracle具有不同的排序规则,具体取决于它正在比较的值是否填充空白。比较两个CHAR字段福尔斯空白填充规则-即最短字段自动获得填充到最长字段长度的空间。
这意味着您的CHAR字段应该可以进行比较,而不需要进行修剪。您可以在我创建的db<> fiddle中看到这一点-一个用于18c,一个用于21c(因为db<>fiddle没有19 c版本可供运行)。

create table t1 (col1 char(2));

create table t2 (col1 char(4));

insert into t1 (col1)
select 'aa' from dual union all
select 'bb' from dual;

insert into t2 (col1)
select 'aa  ' from dual union all
select 'cc  ' from dual;

select t1.col1 t1_col1, t2.col1 t2_col1, dump(t1.col1) dump_t1_col1, dump(t2.col1) dump_t2_col1
from   t1
       full outer join t2 on t1.col1 = t2.col1;

T1_COL1 T2_COL1 DUMP_T1_COL1        DUMP_T2_COL1
------- ------- ------------------- -------------------------
aa      aa      Typ=96 Len=2: 97,97 Typ=96 Len=4: 97,97,32,32
        cc      NULL                Typ=96 Len=4: 99,99,32,32
bb              Typ=96 Len=2: 98,98 NULL

字符串
这让我认为Dai(从对您问题的评论来看)是正确的,您正在比较的列实际上并不是两个CHAR列。

相关问题