Создание списка значений через запятую в операторе Oracle SQL - PullRequest
1 голос
/ 28 апреля 2011

Я пытаюсь создать разделенный запятыми список значений из поля в 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 ]

7 голосов
/ 28 апреля 2011

В Oracle вы бы использовали один из многих методов агрегирования строк , собранных Тимом Холлом на этой странице.

Если вы используете 11,2,

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

В более ранних версиях я предпочел бы использовать метод пользовательских статистических функций (Тим называется string_agg) для выполнения

SELECT string_agg( display )
  INTO l_list
  FROM TestTable
0 голосов
/ 29 апреля 2011

Возможно, попробуйте 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;
0 голосов
/ 28 апреля 2011

Вы не можете вставить несколько значений в одну переменную, если не объедините их каким-либо образом.

Чтобы получить только одно значение (не уверен в синтаксисе оракула),

select @myVar = select top 1 Field1 From myTable

В противном случае, чтобы объединить значения (опять же, не уверен в Oracle)

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