加入号码包含在字符串中

时间:2017-09-25 08:37:50

标签: sql oracle

在我的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。

如何全部退货?

2 个答案:

答案 0 :(得分:2)

你可以尝试这个,但不是完全有效的

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

答案 1 :(得分:1)

在两个字段之前和之后连接逗号,然后使用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子句中指定连接条件。
  • 字符串文字由'单引号括起。双引号(主要用于)对对象标识符(即列名称)强制区分大小写。