2016-06-30 153 views
1

我在此處看到有關將數據值拆分成行的其他解決方案,但到目前爲止,它們都不適用於Sybase IQ--或者因爲它不受支持,或者我沒有適當的訪問來創建程序。我可以在Java中很容易地做到這一點,但試圖在查詢中做到這一點,所以我可以避免開銷。Sybase IQ - 將列中的逗號分隔值拆分爲行

那麼我現在要做的是利用這個......

ID  | Data 
abc | 18,20,22 
def | 17,19 
ghi | 13,19 

並將其轉換成...

ID  | Data 
abc | 18 
abc | 20 
abc | 22 
def | 17 
def | 19 
ghi | 13 
ghi | 19 
  1. 我試圖遞歸方法,但得到的錯誤,遠程服務器不支持它

  2. 我試過下面的XML版本,但我不斷收到語法錯誤在最後一行。我能想到的唯一的事情就是Cross Apply不被支持,因爲Aqua Data不像其他所有的事情那樣突出顯示單詞。

    SELECT A.ID, 
         Split.a.value('.', 'VARCHAR(100)') AS Data 
    FROM 
    (
    SELECT ID, 
        CAST ('<M>' + REPLACE(Data, ',', '</M><M>') + '</M>' AS XML) AS Data 
    FROM mytable 
    ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a); 
    
  3. 我無法創建,因爲權限

  4. 我嘗試使用此功能的Sybase(SA-分列表)功能/程序...

    http://dcx.sybase.com/1200/en/dbreference/sa-split-list-sysproc.html

    但不知道如何納入它

任何人都可以提供幫助?

+0

您正在使用哪個版本的Sybase IQ?我的版本中沒有看到任何XML功能。你確定你不在Sybase ASE上嗎? – stevepastelan

+0

對不起,這是一段時間,但我記得在尋找解決方案時搜索Sybase IQ。可能是因爲它根本不支持。我並沒有停留在XML上。我只是試圖找出一種分割方式,而無需創建過程 – cpd1

回答

0

我認爲它可以用遞歸查詢來完成,如以下幾點:

with recursive temp (n, ID, init_str, next_comma, value, str) as (
    select 0, ID, data as init_str, cast(null as integer), cast(null as varchar(200)), init_str as str 
    from (
     select 'abc' as ID, '18,20,22' as Data union 
     select 'def' as ID, '17,19' as Data union 
     select 'ghi' as ID, '5' as Data 
    ) mydata 

    union all 

    select n+1, ID, init_str, locate(str, ',') 
    , case when locate (str, ',') = 0 then str else substr(trim(str), 0, locate (str, ',')) end 
    , case when locate(str, ',') = 0 then '' else substr(trim(str), locate(str, ',')+1) end 
    from temp 
    where len(trim(str)) > 0 
) 
select * 
from temp 
where value is not null 
; 

不幸的是,我認爲Sybase IQ中只有遞歸部分支持。特別是,當我用一張真實表格替換mydata CTE時,整個事情就崩潰了。