在Oracle SQL语句中构建以逗号分隔的值列表

时间:2011-04-28 17:34:11

标签: oracle select-into

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

我找到了一些示例代码:

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

但是当我尝试时,我总是得到一个关于FROM关键字的错误,而不是它的预期。我可以使用SELECT INTO并且它可以工作,但如果我有多行,我会得到提取错误。

为什么我不能这样做:

SELECT myVar = Field1
FROM myTable

3 个答案:

答案 0 :(得分:7)

在Oracle中,您将使用此页面上Tim Hall收集的众多string aggregation techniques中的一个。

如果您使用的是11.2,

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

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

SELECT string_agg( display )
  INTO l_list
  FROM TestTable

答案 1 :(得分: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;

答案 2 :(得分:-1)

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

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

select @myVar = select top 1 Field1 From myTable

否则,要连接值(再次,不确定Oracle)

set @myVar = ''  -- Get rid of NULL
select @myVar = @MyVar + ', ' +  Field1 From myTable