【问题标题】:Append value of a column in Oracle在 Oracle 中追加列的值
【发布时间】:2016-04-16 19:47:32
【问题描述】:

我的表中有一个保存 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

【问题讨论】:

  • ip 是如何存储的?它已经用逗号分隔了吗?如果不是,请给出表格的结构。如果您的 DBA 不允许您运行 select * from 查询,那么您希望如何运行我们将提供的查询。

标签: sql oracle


【解决方案1】:

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

试试这个

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

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

还有其他选择 here in this article.

【讨论】:

    【解决方案2】:

    您可以使用 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

    【讨论】:

      猜你喜欢
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2018-08-31
      • 2017-02-06
      • 2016-11-13
      • 2021-03-29
      • 2014-05-09
      相关资源
      最近更新 更多