SQL左连接忽略第一个字母的列

问题描述

我正在尝试使用表 a 中的“order id”和表 b 中的“order ref”来左连接 2 个表。

问题是订单所在的位置完全是数字“12345”,订单参考在相同数字“a12345”之前会有一个字母

想知道是否有办法进行连接但忽略表 b 中的字母?

欢迎任何想法

谢谢

解决方法

当然。你在 JOIN 中看到的东西是真实的陈述;他们根本不需要处理表格数据

A JOIN B ON EXTRACT(HOUR FROM NOW()) = 12

这会将 A 中的所有行与 B 中的所有行连接起来,但仅在每天一小时内(您必须在 12:00 和 12:59:59 之间运行)-与表数据无关>

想象一下,连接的工作方式类似于“A 中的每一行都与 B 中的每一行连接,然后对结果中的每一行评估真值陈述。如果真值为假,则该行被丢弃。因此 {{1} } 是有效的并且包括所有行,因为它总是正确的..


因此,将 A 中的所有行连接到 B 中,其中 B 是开头带有“a”的行将类似于:

ON 1=1

尽管小心;操作表数据会扼杀索引的使用

还要考虑你可以做A JOIN B ON A.ID = SUBSTR(B.ID,2,LENGTH(B.ID) - 1))

,

如果订单引用总是在订单ID前有一个单字母前缀,那么只需加入前者的子串:

SELECT *
FROM TableA a
INNER JOIN TableB b
    ON SUBSTR(b.order_ref,LENGTH(b.order_ref) - 1) = a.order_id;

如果订单引用可能有也可能没有单字母前缀,您可以尝试在任一条件下加入:

SELECT *
FROM TableA a
INNER JOIN TableB b
    ON b.order_ref = a.order_id OR
       SUBSTR(b.order_ref,LENGTH(b.order_ref) - 1) = a.order_id;
,

考虑使用 regexp_* 函数套件来提供帮助。

例如

select * 
from A left join B 
on 
   regexp_extract(A.order_id,‘^\D*(\d+)’,1) =
   regexp_extract(B.order_ref,1);

在这种情况下,\D* 表示非数字字符出现零次或多次,后跟一个或多个由括起来的括号捕获的数字。这让您在连接期间忽略任何数字前缀(如果有)