Oracle11g 将oracle列值拆分为逗号分隔的值

Oracle11g 将oracle列值拆分为逗号分隔的值,oracle11g,Oracle11g,我有一个表,在oracle中列的值为5 我想将column的值更改为类似[5,4,3,2,1]的值数组 表示差值为1的值。对我来说,最简单的方法是为此创建函数 CREATE OR REPLACE FUNCTION toArray (p_value NUMBER) RETURN VARCHAR AS l_result VARCHAR (4000) := '['; BEGIN FOR i IN REVERSE 2 .. p_value LOOP l_resul

我有一个表,在oracle中列的值为5 我想将column的值更改为类似[5,4,3,2,1]的值数组
表示差值为1的值。对我来说,最简单的方法是为此创建函数

CREATE OR REPLACE FUNCTION toArray (p_value NUMBER)
   RETURN VARCHAR
AS
   l_result   VARCHAR (4000) := '[';
BEGIN
   FOR i IN REVERSE 2 .. p_value
   LOOP
      l_result := l_result || i || ',';
   END LOOP;

   IF (p_value >= 1)
   THEN
      l_result := l_result || 1;
   END IF;

   l_result := l_result || ']';
   RETURN l_result;
END;
查询从双数组中选择toArray5 返回结果
[5,4,3,2,1]

这是分层查询的直接应用。如果不熟悉,请参阅Oracle文档。它使用sys_connect_by_path创建值列表,方括号添加到分层查询之外,sys_connect_by_path生成的前导逗号需要先用ltrim截断


我建议使用更简单的方法。希望下面的代码片段能有所帮助。 我能建议的唯一缺点是Listag仅适用于oracle版本11及更高版本。所以它在以下版本中不起作用

SELECT listagg(a.lvl, ',') within GROUP (
ORDER BY a.lvl DESC) somedata
from
  (SELECT '&Enter_val'+1 - level lvl,
    1 lvl2
  from dual
    CONNECT BY level < '&Enter_val'+1
  ORDER BY lvl DESC
  )a;

从这里开始:我想更改列的值是什么意思?是否要通过更改列中的值来修改或更新现有表?是否要将值从单个数字5更改为值数组?这是不可能的-一个列在数据库中只能有一种数据类型。很可能这不是您真正想要的,我只是想说明您选择的用于描述问题的特定词语没有任何意义。我不是要更新现有表。我只是想要提供输出:[5,4,3,2,1]的select查询。如果您使用数据库,仅当手头的问题无法用普通SQL解决或普通SQL解决方案过于复杂、难以维护等时,才创建函数或任何其他类型的PL/SQL代码。不需要函数来解决此问题。
SELECT listagg(a.lvl, ',') within GROUP (
ORDER BY a.lvl DESC) somedata
from
  (SELECT '&Enter_val'+1 - level lvl,
    1 lvl2
  from dual
    CONNECT BY level < '&Enter_val'+1
  ORDER BY lvl DESC
  )a;