我有一个使用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_CHVNF
是CHAR(15)
,C20.CHVNF
是CHAR(36)
。我没有权限重写查询。
Execution plan
有没有什么参数可以控制它?
2条答案
按热度按时间mspsb9vt1#
可以在TSC00_1568128481上创建一个基于函数的索引,如下所示:
字符串
尽管如此,我认为最好更新该列,以便在末尾不再包含空格,并添加约束检查(CHVNF=RTRIM(CHVNF)),并且为了防止由约束引起的问题,在更新每行之前创建一个触发器,将rtrim应用于该列。
yizd12fk2#
根据文档,Oracle具有不同的排序规则,具体取决于它正在比较的值是否填充空白。比较两个
CHAR
字段福尔斯空白填充规则-即最短字段自动获得填充到最长字段长度的空间。这意味着您的CHAR字段应该可以进行比较,而不需要进行修剪。您可以在我创建的db<> fiddle中看到这一点-一个用于18c,一个用于21c(因为db<>fiddle没有19 c版本可供运行)。
字符串
这让我认为Dai(从对您问题的评论来看)是正确的,您正在比较的列实际上并不是两个CHAR列。