首页 > 数据库 > mysql教程 > 如何在 SQL 中有效地拆分和过滤逗号分隔的 VARCHAR 列?

如何在 SQL 中有效地拆分和过滤逗号分隔的 VARCHAR 列?

DDD
发布: 2024-12-24 17:48:12
原创
177 人浏览过

How to Efficiently Split and Filter a Comma-Separated VARCHAR Column in SQL?

在 SQL 中将 VARCHAR 列拆分为多个值

SQL 中的 VARCHAR 数据类型允许存储可变长度字符数据。通常,需要将 VARCHAR 列拆分为多个值,以方便数据过滤或其他操作。

考虑以下示例:

SELECT 
  AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448
登录后复制

此查询检索名为“Value”的列来自表“AD_Ref_List”,其中列“AD_Reference_ID”等于 1000448。结果是以下列表值:

CO,VO
登录后复制

但是,要求是根据存储在不同表中的值来限制结果,“xx_insert”:

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283
登录后复制

此查询的结果是:

CO
登录后复制

挑战在于修改原始查询以合并“xx_insert”中的值,同时保持逗号分隔 格式。最初的尝试将值转换为分隔字符串:

AD_Ref_List.Value IN ('CO,VO')
登录后复制

这不是所需的结果。

解决方案:

解决此问题问题,IN 子句中的值应该用适当的分隔符括起来,并对照逗号分隔的列表进行检查,该列表也用分隔符:

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, '[^,]+' )
);
登录后复制

两种解决方案都有效地将 VARCHAR 列拆分为多个值,并根据指定的值进行过滤,解决了最初遇到的问题查询。

以上是如何在 SQL 中有效地拆分和过滤逗号分隔的 VARCHAR 列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板