如何在oracle中拆分逗号分隔字段?

时间:2014-08-06 12:51:13

标签: sql oracle

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

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

我怎样才能实现这一目标。请帮帮我。提前谢谢。

此致

3 个答案:

答案 0 :(得分:2)

我假设你有一张统治表。如果是这样,您可以使用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,每个警报和规则都有一行。

答案 1 :(得分:0)

在此处找到: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
;

可以包含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
;

答案 2 :(得分:0)

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