在Oracle中追加列的值

时间:2016-01-12 09:14:39

标签: sql oracle

我的表中有一列可以保存IP地址。我不知道该列中有多少IP,因为权限,我的DBA无法帮助我使用假脱机到select * from table

有没有办法可以追加列值?

ID   --   Name   --   IP
1         ABC        192.168.00.00, 192.168.00.11,...

我想通过逗号分隔来附加IP,如下所示

ID   --   Name   --   IP
1         ABC        192.168.00.00, 192.168.00.11,..., 192.168.00.22

2 个答案:

答案 0 :(得分:2)

不是100%确定你的意思,但我猜你的列IP正在存储一个IP地址,你想要做一个“字符串聚合”来将所有IP分组为相同的ID和名称为一个字符串。

试试这个

SELECT ID, Name, wm_concat(IP) AS IPs
FROM   table
GROUP BY ID, Name;

OR

SELECT ID, Name, LISTAGG(IP, ',') WITHIN GROUP (ORDER BY IP) AS IPs
FROM   table
GROUP BY ID, Name;

还有其他选择here in this article.

答案 1 :(得分:1)

您可以使用 LISTAGG

例如,

SQL> SELECT deptno id,
  2    listagg(ename, ',') WITHIN GROUP (
  3  ORDER BY empno) NAME
  4  FROM emp
  5  GROUP BY deptno;

        ID NAME
---------- ------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,JONES,SCOTT,ADAMS,FORD
        30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

SQL>

但请记住,LISTAGG的SQL限制为4000个字符/字节。如果您的字符串聚合超过4000个字符,则会收到ORA-01489: result of string concatenation is too long。您可以使用 XMLAGG 作为替代方案。见https://stackoverflow.com/a/29776515/3989608