使用列表中的in子句加入oracle [重复]
Posted
技术标签:
【中文标题】使用列表中的in子句加入oracle [重复]【英文标题】:join in oracle using in clause for a list [duplicate] 【发布时间】:2021-08-09 19:20:16 【问题描述】:我有两张桌子,一张是transaction
,另一张是trackingNumber
事务有trackingNumberList
,其中包含123, 235, 55
之类的值。这里123
是trackingNumber
的id
,其他2 个值相同。
我想通过 trackingNumber 加入交易,但我没有找到任何加入列表的解决方案。
我也试过INSTR
,但它没有给出正确的数据。
select tn.*, t.id
from transaction t
left join TrackingNumber tn on INSTR(t.trackingnumberlist, tn.id) > 0
where t.id = 2439845;
我正在使用 ORACLE 数据库。
【问题讨论】:
首先不要将逗号分隔的列表放在列中。 @Barmar 不,我已经尝试过 INSTR,但这也给了我一些不需要的记录 接受的答案是错误的,请参阅其他答案。 该答案下方的评论解释了为什么它返回不需要的记录。我知道你已经尝试过INSTR()
,这是问题所在。
【参考方案1】:
不要拆分字符串;只需将列表和 id 包装在您正在使用的分隔符中,并使用 LIKE
进行子字符串匹配:
select tn.*, t.id
from transaction t
left join TrackingNumber tn
on (', '||t.trackingnumberlist||', ' LIKE '%, '||tn.id||', %')
where t.id = 2439845;
如果你想使用INSTR
做同样的事情:
select tn.*, t.id
from transaction t
left join TrackingNumber tn
on (INSTR(', '||t.trackingnumberlist||', ', ', '||tn.id||', ') > 0)
where t.id = 2439845;
【讨论】:
出现错误:LIKE 运算符仅支持 CHAR、VARCHAR、WCHAR 和 WVARCHAR 字段,我尝试了||cast(tn.id as varchar(50))
,但它也不起作用
@ChakreshwarSharma 您也可以使用INSTR
,只需将值包装在分隔符中,以免与元素的部分子字符串匹配。【参考方案2】:
如果您将逗号分隔的值拆分为行,则可以将此类子查询与另一个表连接起来。看看下面的例子。第 1 - 11 行中的示例数据,您可能感兴趣的查询从第 12 行开始。
SQL> with
2 transaction (trackingnumberlist, city) as
3 (select '123, 235, 55', 'London' from dual union all
4 select '22' , 'Paris' from dual
5 ),
6 trackingnumber (id, name) as
7 (select '123', 'Little' from dual union all
8 select '235', 'Foot' from dual union all
9 select '55' , 'Sharma' from dual union all
10 select '22' , 'Barmar' from dual
11 )
12 select n.id,
13 n.name,
14 x.city
15 from trackingnumber n
16 join (select trim(regexp_substr(t.trackingnumberlist, '[^,]+', 1, column_value)) id,
17 t.city
18 from transaction t cross join
19 table(cast(multiset(select level from dual
20 connect by level <= regexp_count(t.trackingnumberlist, ',') + 1
21 ) as sys.odcinumberlist ))
22 ) x
23 on x.id = n.id
24 order by n.id, n.name;
ID NAME CITY
--- ------ ------
123 Little London
22 Barmar Paris
235 Foot London
55 Sharma London
SQL>
【讨论】:
以上是关于使用列表中的in子句加入oracle [重复]的主要内容,如果未能解决你的问题,请参考以下文章