我已经经历过一些问题,但我无法找到我正在寻找的东西。 假设我有一个表格如下:
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
请注意,添加的第三列是逗号分隔值的计数。 查找单个列的计数很简单,但这似乎很难,如果不是不可能的话。 提前谢谢。
答案 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
答案 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>