计算Oracle SQL中所有列的逗号分隔值

时间:2015-01-12 12:24:35

标签: sql oracle

我已经经历过一些问题,但我无法找到我正在寻找的东西。 假设我有一个表格如下:

Col1        Col2        Col3
1,2,3       2,3,4,5,1   5,6

我需要使用select语句得到如下结果:

Col1        Col2        Col3
1,2,3       2,3,4,5,1   5,6
3           5           2

请注意,添加的第三列是逗号分隔值的计数。 查找单个列的计数很简单,但这似乎很难,如果不是不可能的话。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

select
col1,
regexp_count(col1, ',') + 1 as col1count,
col2,
regexp_count(col2, ',') + 1 as col2count,
col3,
regexp_count(col3, ',') + 1 as col3count
from t

FIDDLE

FIDDLE2

答案 1 :(得分:2)

根据Count the number of elements in a comma separated string in Oracle,一种简单的方法是count the number of commas,然后添加1

您只需将结果联合到原始数据上即可。所以,做到这一点:

SQL> with the_data (col1, col2, col3) as (
  2  select '1,2,3', '2,3,4,5,1', '5,6' from dual
  3         )
  4  select a.*
  5    from the_data a
  6   union all
  7  select to_char(regexp_count(col1, ',') + 1)
  8       , to_char(regexp_count(col2, ',') + 1)
  9       , to_char(regexp_count(col3, ',') + 1)
 10    from the_data;

COL1  COL2      COL
----- --------- ---
1,2,3 2,3,4,5,1 5,6
3     5         2

您需要将结果转换为字符,因为您要将字符与一个数字联合,而Oracle会抱怨该数字。

值得注意的是,以这种方式存储数据违反了第一种正常形式。这使得操作变得更加困难并且几乎不可能限制为正确。值得考虑规范化您的数据模型以使其更简单。其他查询更简单。

答案 2 :(得分:1)

  

查找单个列的计数很简单,但这似乎很难,如果不是不可能的话。

所以你不要手动查找每一列?你想要它动态。

设计实际上存在缺陷,因为它违反了规范化。但是如果你愿意继续使用它,那么你可以使用 REGEXP_COUNT 在PL / SQL中完成它。

类似的东西,

SQL> CREATE TABLE t AS
  2  SELECT '1,2,3' Col1,
  3    '2,3,4,5,1' Col2,
  4    '5,6' Col3
  5  FROM dual;

Table created.

SQL>
SQL> DECLARE
  2    cnt NUMBER;
  3  BEGIN
  4    FOR i IN
  5    (SELECT column_name FROM user_tab_columns WHERE table_name='T'
  6    )
  7    LOOP
  8      EXECUTE IMMEDIATE 'select regexp_count('||i.column_name||', '','') + 1 from t' INTO cnt;
  9      dbms_output.put_line(i.column_name||' has cnt ='||cnt);
 10    END LOOP;
 11  END;
 12  /
COL3 has cnt =2
COL2 has cnt =5
COL1 has cnt =3

PL/SQL procedure successfully completed.

SQL>

可能在 SQL 本身中会有 XML 解决方案,而不使用 PL / SQL

在SQL中 -

SQL> WITH DATA AS
  2    ( SELECT '1,2,3' Col1, '2,3,4,5,1' Col2, '5,6' Col3 FROM dual
  3    )
  4  SELECT regexp_count(col1, ',') + 1 cnt1,
  5    regexp_count(col2, ',')      + 1 cnt2,
  6    regexp_count(col3, ',')      + 1 cnt3
  7  FROM t;

      CNT1       CNT2       CNT3
---------- ---------- ----------
         3          5          2

SQL>