我有一张包含以下内容的表格:
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
我怎样才能实现这一目标。请帮帮我。提前谢谢。
此致
答案 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