【问题标题】:Join on number is contained in string [duplicate]加入号码包含在字符串中[重复]
【发布时间】:2017-09-25 17:32:36
【问题描述】:

在我的 oracle 数据库中,我有 2 个表,我必须加入它们,在表 A 中我的列 ID 是数字,在表 B 中我的列 SCIDS 是 varchar2。举个例子:

TABLEA.ID | TABLEB.SCIDS
162       | 162,163
162       | 555,162,33
161       | 161

我尝试了一些 sql

select A.ID
from TABLEA A
    left JOIN TABLEB B 
where "," || S.ID in "," || B.SCIDS

这不起作用,它只返回 SCIDS 中不是“数组”的记录,例如第 3 条记录 161。

如何全部退回?

【问题讨论】:

标签: sql oracle


【解决方案1】:

你可以试试这个,虽然效率不高

with dist_tablea
     AS (SELECT DISTINCT ID
           FROM TABLEA)

SELECT a.ID, B.SCIDS
  FROM dist_tablea a LEFT JOIN TABLEB b ON REGEXP_LIKE (b.SCIDS, '(^|,)'||a.id||'(,|$)')

输出

    ID  SCIDS
-------  -------
    161 161
    162 162,163
    162 555,162,33

【讨论】:

  • 这很有效,谢谢。
  • 这不起作用 - 它将匹配 ID = 16SCIDS = 161,162,因为它正在进行子字符串匹配,而 16161 的子字符串。此外,使用REGEXP_LIKE 比仅使用LIKE 效率低得多(并且在此处添加正则表达式没有任何好处)。
  • @MT0 你是对的
  • @MT0:谢谢! .现在修改模式。
  • @MasterYi:现在检查..
【解决方案2】:

在两个字段前后连接逗号,然后使用LIKE 运算符:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE TABLEA( ID ) AS
  SELECT 161 FROM DUAL UNION ALL
  SELECT 162 FROM DUAL;

CREATE TABLE TABLEB( SCIDS ) AS
  SELECT '162,163' FROM DUAL UNION ALL
  SELECT '555,162,33' FROM DUAL UNION ALL
  SELECT '161' FROM DUAL;

查询 1

SELECT *
FROM   TABLEA A
       LEFT OUTER JOIN TABLEB B
       ON ( ',' || B.SCIDS || ',' LIKE '%,' || A.ID || ',%' )

Results

|  ID |      SCIDS |
|-----|------------|
| 161 |        161 |
| 162 |    162,163 |
| 162 | 555,162,33 |

还有:

  • 当您使用LEFT [OUTER] JOIN 时,您需要在ON 子句中指定连接条件。
  • 字符串文字用' 单引号括起来。双引号(主要)用于对对象标识符(即列名)强制区分大小写。

【讨论】:

  • 这也是可接受的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2016-08-19
  • 2013-09-12
相关资源
最近更新 更多