【问题标题】:how to split a comma seperated field in oracle?如何在oracle中拆分逗号分隔的字段?
【发布时间】:2014-08-06 12:51:13
【问题描述】:

我有一个包含以下内容的表格:

SQL> select RULE_IDS ||' | '|| ID ||' | '|| ALERT_COUNT from alarms ;

RULE_IDS||'|'||ID||'|'||ALERT_COUNT
--------------------------------------------------------------------------------
3714,3715,3703 | 1031 | 3
3703,3714,3722,3721 | 1032 | 4
3715 | 1033 | 1
3721,3722 | 1034 | 2
3714,3715 | 1035 | 2
3706 | 1030 | 1
3723,3714 | 1036 | 2
3703 | 1025 | 1`

我的要求是找到每个 RULE_IDS(逗号分隔值)的计数。例如输出应该是这样的:

SQL> select RULE_IDS ||' | '|| ID ||' | '|| ALERT_COUNT from alarms ;

RULE_IDS||'|'||COUNT
--------------------------------------------------------------------------------
3714 | 4
3715 | 3
3703 | 3
3721 | 2
3722 | 2
3723 | 1
3706 | 1

我怎样才能做到这一点。请帮帮我。提前致谢。

问候

【问题讨论】:

标签: sql oracle


【解决方案1】:

假设您有一个规则表。如果是这样,您可以使用join

select r.rule_id, count(*)
from alarms a join
     rules r
     on ',' || a.rule_ids || ',' like '%,' || r.rule_id || ',%'
group by r.rule_id;

将 id 列表存储为逗号分隔的字符串是一个坏主意。一方面,您将整数值存储为字符串。更重要的是,SQL 有一个非常好的存储列表的结构。它被称为表。在这种情况下,您需要一个联结表 AlertRules,每个警报和规则只有一行。

【讨论】:

  • 你好 Gordon,我对 SQL 比较陌生。能否请您解释一下您所做的加入。
  • @Mariners 。 . .除了查询使用like 在列表中查找元素并在每个值周围放置分隔符之外,很难解释,因此101010 不匹配。
【解决方案2】:

在这里找到:https://community.oracle.com/thread/2348338

使用 REGEXP_SUBSTR:

SELECT  REGEXP_SUBSTR (str, '[^,]+', 1, 1)    AS part_1
,       REGEXP_SUBSTR (str, '[^,]+', 1, 2)    AS part_2
,       REGEXP_SUBSTR (str, '[^,]+', 1, 3)    AS part_3
,       REGEXP_SUBSTR (str, '[^,]+', 1, 4)    AS part_4
FROM    table_x
;

str 可以包含emply 项吗?例如,您是否可以有一个像 'foo,,,bar' 这样的字符串,您希望将 part_2 和 part_3 计为 NULL,而 'bar' 是 part_4?如果是这样:

SELECT  RTRIM (REGEXP_SUBSTR (str, '[^,]*,', 1, 1), ',')    AS part_1
,       RTRIM (REGEXP_SUBSTR (str, '[^,]*,', 1, 2), ',')    AS part_2
,       RTRIM (REGEXP_SUBSTR (str, '[^,]*,', 1, 3), ',')    AS part_3
,       LTRIM (REGEXP_SUBSTR (str, ',[^,]*', 1, 3), ',')    AS part_4
FROM    table_x
;

【讨论】:

    【解决方案3】:
    select
          coalesce(substr(RULE_IDS,1,instr(RULE_IDS,',')-1),RULE_IDS) as RULE_IDS
        , length(RULE_IDS) - length(replace(RULE_IDS,',','')) + 1     as num_of
    from Table1
    

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2023-01-03
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      相关资源
      最近更新 更多