1

我正在尝试从 Oracle 中的字段构建一个逗号分隔的值列表。

我找到了一些执行此操作的示例代码:

DECLARE @List VARCHAR(5000)
SELECT @List = COALESCE(@List + ', ' + Display, Display)
FROM TestTable
Order By Display

但是,当我尝试这样做时,总是会收到关于 FROM 关键字不是预期的错误。我可以使用SELECT INTO它并且它可以工作,但是如果我有不止一行,我会收到获取错误。

为什么我不能这样做:

SELECT myVar = Field1
FROM myTable
4

3 回答 3

7

在 Oracle 中,您将使用Tim Hall 在此页面上收集的众多字符串聚合技术之一。

如果您使用的是 11.2,

SELECT LISTAGG(display, ',') WITHIN GROUP (ORDER BY display) AS employees
  INTO l_list
  FROM TestTable

在早期版本中,我的偏好是使用用户定义的聚合函数方法(Tim's is called string_agg)来做

SELECT string_agg( display )
  INTO l_list
  FROM TestTable
于 2011-04-28T18:16:50.370 回答
0

也许尝试 DBMS_UTILITY.COMMA_TO_TABLE 和 TABLE_TO_COMMA 来拆分/加入 csv:

DECLARE
  l_list1   VARCHAR2(50) := 'Tom,Dick,Harry,William';
  l_list2   VARCHAR2(50);
  l_tablen  BINARY_INTEGER;
  l_tab     DBMS_UTILITY.uncl_array;
BEGIN
  DBMS_OUTPUT.put_line('l_list1 : ' || l_list1);

  DBMS_UTILITY.comma_to_table (
     list   => l_list1,
     tablen => l_tablen,
     tab    => l_tab);

  FOR i IN 1 .. l_tablen LOOP
    DBMS_OUTPUT.put_line(i || ' : ' || l_tab(i));
  END LOOP;

  DBMS_UTILITY.table_to_comma (
     tab    => l_tab,
     tablen => l_tablen,
     list   => l_list2);

  DBMS_OUTPUT.put_line('l_list2 : ' || l_list2);
END;
于 2011-04-29T11:31:09.303 回答
-1

您不能将多个值插入单个变量,除非您以某种方式将它们连接起来。

要仅获取单个值(不确定 oracle 语法),

选择 @myVar = 从 myTable 中选择前 1 个 Field1

否则,连接值(同样,不确定 Oracle)

set @myVar = '' -- 去掉 NULL
从 myTable 中选择 @myVar = @MyVar + ', ' + Field1
于 2011-04-28T17:42:52.087 回答