2013-08-28 25 views
0
字符串的最佳方式

我試圖把object_type,ABC,00,DEF,XY串入ABC-00-DEF-XY-解析和連接具有SQL

這裏就是我有,我想知道如果有一個更有效的方法?

CONCAT(
    REPLACE(
     SUBSTR(a.object_name, 
       INSTR(a.object_name, ',',1,1)+1, 
       INSTR(a.object_name, ',',1,2)+1 
      ),',','-' 
      ),'-' 
    ) 

澄清:我需要脫掉一切直到幷包括第一個逗號,用短劃線代替所有剩餘逗號,然後添加破折號到端。

+0

可能正則表達式替換 - 很難說在這裏你完全要求 – Randy

+0

澄清的第一篇文章,我希望 – trueimage

+1

你的做法是足夠的效率,你可以在這裏做的最好的事情是讓你的INSTR/SUBSTR /替換代碼短。正則表達式可能看起來很整潔,但表現更差。 –

回答

1

試試這個

replace(substr(a.object_name,instr(a.object_name,',',1,1) + 1),',','-') ||'-' 
0

,我建議使用下面的代碼:

REPLACE(SUBSTRING(a.object_name,13,LEN(@object_name)-11),',','-') + '-' 
+0

在這種情況下,-11不起作用,因爲另一個輸入示例可能是「ABCD-PAD12-EFGH-XZZ」,構成這些段的字段在理論上可能最多爲32個字母數字字符(儘管我們只使用現在2-5) – trueimage

+0

您是否嘗試過我建議的內容,因爲它適用於我,無論您的輸入時間長短如何object_type,ABCD,PAD12,EFGH,XZZ將返回ABCD-PAD12-EFGH-XZZ- – SamoanProgrammer

+0

我在@,SUBSTRING,LEN,+上遇到很多錯誤。我把它改成這個來讓它運行,但-11會引起問題,因爲字符串的第一部分也可能是可變的。假定所有組件都是可變的。 REPLACE(SUBSTR(a.object_name,13,LENGTH(a.object_name)-11),',',' - ')|| 「-'' – trueimage

1

Rexexp_replace()正則表達式的功能就可以派上用場在這種情況下,以及:

select ltrim(
      regexp_replace(col 
          , '([^,]+)|,([^,]+)', '\2-' 
          ) 
      , '-' 
      ) as res 
from t1 

結果:

RES 
-------------- 
ABC-00-DEF-XY- 

SQLFiddle Demo