首页 > 解决方案 > 如何在 SQL 中将 varchar 列拆分为多个值?

问题描述

我有这个 SQL 选择语句

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

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

最好的祝福

标签: sqloracleselect

解决方案


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

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

推荐阅读