如何在SQL中将varchar列拆分为多个值?

时间:2018-05-02 13:44:05

标签: sql oracle select

我有这个SQL Select语句

/account/123/login

这是SELECT的结果:

enter image description here

为限制所选行,我在其他表中存储了几个值,如下所示:

SELECT 
  AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448

enter image description here

所以,我的最终SQL Select是这样的:

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283

问题:这个SELECT没有返回任何一行,因为Oracle已经像这样转换了:SELECT AD_Ref_List.Value FROM AD_Ref_List WHERE AD_Ref_List.AD_Reference_ID= 1000448 AND AD_Ref_List.Value IN (SELECT xx_insert.XX_DocAction_Next FROM xx_insert WHERE xx_insert_id = 1000283 ) ;

但是,我需要的是:AD_Ref_List.Value IN ('CO,VO')

我该怎么办?

祝你好运

2 个答案:

答案 0 :(得分:5)

将值包含在分隔符列表中使用的分隔符中,然后检查它是否是分隔列表的子字符串(也包含分隔符):

SELECT r.Value
FROM   AD_Ref_List r
       INNER JOIN xx_insert x
       ON ( ',' || x.XX_DocAction_Next || ',' LIKE '%,' || r.value || ',%' )
WHERE  r.AD_Reference_ID = 1000448
AND    x.xx_insert_id    = 1000283;
  

我必须将逻辑保留在whereClause

真的,不要。上述查询效率会更高。

但如果你不得不这样做:

SELECT Value
FROM   AD_Ref_List
WHERE  AD_Reference_ID = 1000448
AND    value IN (
  SELECT REGEXP_SUBSTR( XX_DocAction_Next, '[^,]+', 1, LEVEL )
  FROM   xx_insert
  WHERE  xx_insert_id    = 1000283
  CONNECT BY LEVEL <= REGEXP_COUNT( XX_DocAction_Next, '[^,]+' )
);

答案 1 :(得分:0)

您可以使用REGEXP_LIKE()

SELECT l.value
  FROM ad_ref_list l INNER JOIN xx_insert xx
    ON REGEXP_LIKE(a.value, '^(' || REPLACE(xx.xx_docaction_Next, ',', '|') || '$' )      
 WHERE l.ad_reference_id = 1000448
   AND xx.xx_insert_id = 1000283;

希望这有帮助。