问题描述
我正在尝试使用表 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*
表示非数字字符出现零次或多次,后跟一个或多个由括起来的括号捕获的数字。这让您在连接期间忽略任何数字前缀(如果有)