繁体   English   中英

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

[英]How to split a varchar column as multiple values in SQL?

我有这个SQL Select语句

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

这是SELECT的结果:

在此处输入图片说明

为了限制所选行,我有一对夫妇存储在其他表中这样的值:

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283

在此处输入图片说明

因此,我最终的SQL Select是这样的:

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
  )
;

问题:此SELECT不返回任何行,因为Oracle已经这样转换: AD_Ref_List.Value IN ('CO,VO')

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

我怎样才能做到这一点???

最好的祝福

将值包装在定界列表中使用的定界符中,然后检查它是否是定界列表的子字符串(还包含定界符):

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;

我必须保持逻辑在哪里

真的不是 上面的查询将更加有效。

但是如果您必须:

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, '[^,]+' )
);

您可以使用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;

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM