使用列表中的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 之类的值。这里123trackingNumberid,其他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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有 IN 子句中参数列表的 PreparedStatement [重复]

将字符串列表绑定到 IN 子句 [重复]

Oracle In子句

Oracle - IF 子句中的子查询 [重复]

安全地为查询准备逗号分隔列表[重复]

MySql IN 子句,试图匹配元组的 IN 列表