2011-04-28 70 views
1

我試圖在Oracle中的字段之外構建逗號分隔值列表。在Oracle SQL語句中構建逗號分隔值列表

我找到了一些示例代碼,這是否:

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

但是當我嘗試,我總是得到一個錯誤有關FROM關鍵字不被它預期。我可以使用SELECT INTO,它可以工作,但如果我有多個行,則會出現讀取錯誤。

爲什麼我不能做如下:

SELECT myVar = Field1 
FROM myTable 
+0

如果你po st代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地格式化和語法突出顯示它! – 2011-04-28 18:00:30

+0

可能的重複[如何將多行組合到Oracle中的逗號分隔列表中?](http://stackoverflow.com/questions/468990/how-can-i-combine-multiple-rows-into-a-逗號分隔列表in-oracle) – Ben 2014-09-26 07:54:25

回答

-1

您不能插入多個值到一個單一變量,除非你以某種方式將它們連接起來。

要獲得唯一一個值的(不知道甲骨文語法),

select @myVar = select top 1 Field1 From myTable 

否則,以連接值(再次,不知道甲骨文)

 
set @myVar = '' -- Get rid of NULL 
select @myVar = @MyVar + ', ' + Field1 From myTable 
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 
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; 
+0

此實用程序僅適用於符合Oracle命名約定的標記(30個字符的長度,不能以數字開頭等)。或者至少它曾經。它可能在數據庫的後續版本中發生了變化 - 我多年以來沒有使用它。 – APC 2013-04-10 05:52:43

+0

@APC:顯示我的年齡我想;-)我真的不是那麼古老,但我有時候感覺老了(尤其是閱讀一些關於這個問題的問題)。 – tbone 2013-04-11 16:38:10

+0

對不起VBAHole,我對SO問題的評論並不針對你! – tbone 2013-04-12 13:01:16