在Oracle SQL Developer中比较不同长度的VARCHAR2

时间:2019-05-31 09:23:45

标签: sql oracle

添加了一个新表,我可以在该表中通过新系统处理付款。问题是它仅包含一些信息,因此我需要将其与另一个表进行匹配以获得完整的信息。 基本上,可以将事务匹配在一起的列在旧表中的类型为varchar2(20),但在新表中的类型为varchar2(80)。

新表(称为Z)可以容纳从11位数字引用到30-40个字符引用(可以是数字/字母/某些特殊字符)的任何内容。我要实现的目标是将其与仅包含11位数字的参考号相匹配的旧表(简称X)。

因此,假设Z表看起来像这样:

TransactionType Reference
Purchase        abcd-efgh-1923-aa22
Refund          12345678910

表X看起来像:

Purchase Reference
Shoes    12345678910
Jacket   10987654321

实际上,我想查找退款和给定的参考信息,即购买的商品。

我对SQL还是很陌生,我一直在尝试查看强制转换/转换的功能,但是在尝试强制转换和转换时,我有点迷失了。

我尝试过:

select purchase from x, z
where x.reference=z.reference;

select purchase from x,z
where to_number(x.reference)=to_number(z.reference);

select purchase from x,z
where x.reference=cast(z.reference as varchar2(20)); --- and viceversa, casting x to varchar2(80)

没有输出,尽管当我检查一天退款然后在同一天购买时,会有一些匹配的参考。假设我们有一天会返回5行,但不会返回任何行。

1 个答案:

答案 0 :(得分:0)

TO_CHAR函数应该在这里为您提供覆盖:

SELECT x.Purchase, x.Reference
FROM X x
INNER JOIN Z z
    ON TO_CHAR(x.Reference) = TO_CHAR(z.Reference)
WHERE z.TransactionType = 'Refund';

如果您想限制使用某个参考,则只需在WHERE子句中包含该要求即可。

请注意,我重构了您的联接以使用现代的显式内部联接。这是编写SQL代码的首选方式。