簡體   English   中英

Oracle 8i SQL-連接來自不同行的字符串

[英]Oracle 8i SQL - concatenate strings from different rows

我需要串聯來自不同行的字符串,如下所示。
每個NAME的行數是可變的,並且其范圍是未知的。

NAME  COLOR
Bob   Red
Bob   Blue
Tom   Green
John  Red
John  Yellow
John  Purple

所需的輸出:

NAME  COLORS
Bob   RedBlue
Tom   Green
John  RedYellowPurple

我面臨的局限性是:

  • Oracle 8i(8.1.7.4.0)-我對此無能為力,無法升級
  • 只讀訪問
  • 無法創建...

所以基本上:

  • 沒有創建
  • 沒有LISTAGG
  • 沒有XMLAGG
  • 沒有WM_CONCAT
  • 沒有參考光標
  • 否SYS_CONNECT_BY_PATH

我是SOL嗎?

Oracle 8i至少支持分析功能,因此您可以使用row_number()dense_rank()每個顏色值分配一個標稱數字(按您認為有意義的順序):

select name, color,
  row_number() over (partition by name order by color) as rn
from your_table;

然后在手動數據透視表上使用一個變體,每個可能的行號使用一個max(decode())

select name,
  max(decode(rn, 1, color))
  || max(decode(rn, 2, color))
  || max(decode(rn, 3, color))
  || max(decode(rn, 4, color))
  || max(decode(rn, 5, color))
  || max(decode(rn, 6, color))
  || max(decode(rn, 7, color))
  -- ...
  as colors
from (
  select name, color,
    row_number() over (partition by name order by color) as rn
  from your_table
)
group by name
order by name;

NAME       COLORS                                                                
---------- ----------------------------------------------------------------------
Bob        BlueRed                                                               
John       PurpleRedYellow                                                       
Tom        Green                                                                 

您說的范圍是未知的,但是即使每個名稱的行數不受限制,但最終的字符串仍必須限制為最多4000個字符-根據您對實際顏色值的了解,您可以使用的最大數量。 (並且您可以一次性生成解碼部分)。

如果需要,可以用相同的方式包括定界符:

select name,
  max(decode(rn, 1, color))
  || max(decode(rn, 2, ',')) || max(decode(rn, 2, color))
  || max(decode(rn, 3, ',')) || max(decode(rn, 3, color))
  || max(decode(rn, 4, ',')) || max(decode(rn, 4, color))
  || max(decode(rn, 5, ',')) || max(decode(rn, 5, color))
  || max(decode(rn, 6, ',')) || max(decode(rn, 6, color))
  || max(decode(rn, 7, ',')) || max(decode(rn, 7, color))
  || max(decode(rn, 8, ',')) || max(decode(rn, 8, color))
  -- ...
  as colors
from (
  select name, color,
    row_number() over (partition by name order by color) as rn
  from your_table
  where color is not null
)
group by name
order by name;

NAME       COLORS                                                                                 
---------- ---------------------------------------------------------------------------------------
Bob        Blue,Red                                                                               
John       Purple,Red,Yellow                                                                      
Tom        Green                                                                                  

我在內部查詢中包含了一個is not null過濾器,以防萬一該列可為空-應該防止最終列表中的空元素。

(未在8i中進行測試,因為我找不到一個可以旋轉的舊實例,但是我不認為這會在以后使用任何引入的東西...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM