2015-04-22 18 views
1

算子串的長度,其他的我不得不從SQL字符串(的Oracle 11g)如何從一個字符在Oracle

從這個>>#L1313.0000002.CGNMC這個>>更新字符串的長度#L1313.0000000002.CGNMC

我要計數的點之間的字符串的長度(。),如果它小於10,則我想附加多達零使它的10

計數字符串的整個長度是沒有幫助,因爲這些更改只能在子字符串中完成。

請幫

回答

0
select lpad(substr('#L1313.0000002.CGNMC', 
        instr('#L1313.0000002.CGNMC','.') + 1, 
        instr('#L1313.0000002.CGNMC','.',1,2) - 
        instr('#L1313.0000002.CGNMC','.') - 1), 
      10, '0') from dual; 

lpad('x',10,'0') - 添加字符 '0',以字符串 'X' 高達大小10

substr(string, start, length) - 返回子串

instr(string,substring[,start[,occurence]]) - 返回一個字符串的位置串。開始是搜索的起點,發生意味着搜索字符串的第n次出現。

見甲骨文的文檔https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions.htm#SQLRF006

+0

您的解決方案不完整。 OP只想在點之間的substr長度小於10時才這樣做。 –

+0

@LalitKumarB可能是的。這個問題沒有說明,如果點之間有多於10個字符的數據。在這種情況下,我會添加CASE...WHEN ... ELSE類似於您的示例 –

+0

是的,這是我想指出的。當字符串已經有超過10個字符時,你會強制它爲10.無論如何,希望它有助於:-) –

0

您可以用組合做到這一點:

  • SUBSTR
  • INSTR
  • CASE
  • DECODE

如何進行下面的查詢方式是:

SUBSTR會給我的琴絃的一部分,INSTR會給我點的位置。 CASE是檢查點之間子串長度的條件,最後DECODE會讓我做最後的工作來追加所需的零。

測試用例

我正在考慮所有可能出現的情況。

SQL> WITH DATA AS 
    2 (SELECT '#L1313.0000002.CGNMC' str FROM dual UNION ALL 
    3 SELECT '#L1313.002.CGNMC' str FROM dual UNION ALL 
    4 SELECT '#L1313.00123.CGNMC' str FROM dual UNION ALL 
    5 SELECT '#L1313.12345.CGNMC' str FROM dual UNION ALL 
    6 SELECT '#L1313.12345678910.CGNMC' str FROM dual 
    7 ) 
    8 SELECT str, 
    9 CASE 
10  WHEN instr(str, '.', 1, 2)   - instr(str, '.', 1, 1) -1 < 10 
11  THEN DECODE((instr(str, '.', 1, 2) - instr(str, '.', 1, 1) -1), 
12             9, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
13  ||'0' 
14  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 8, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
15  ||'00' 
16  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 7, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
17  ||'000' 
18  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 6, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
19  ||'0000' 
20  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 5, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
21  ||'00000' 
22  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 4, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
23  ||'000000' 
24  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 3, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
25  ||'0000000' 
26  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 2, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
27  ||'00000000' 
28  ||SUBSTR(str, instr(str, '.', 1, 1) + 1)), 1, (SUBSTR(str, 1, instr(str, '.', 1, 1)) 
29  ||'000000000' 
30  ||SUBSTR(str, instr(str, '.', 1, 1) + 1))) 
31  ELSE 
32  str 
33 END new_str 
34 FROM DATA; 

STR      NEW_STR 
------------------------ --------------------------------------------- 
#L1313.0000002.CGNMC  #L1313.0000000002.CGNMC 
#L1313.002.CGNMC   #L1313.0000000002.CGNMC 
#L1313.00123.CGNMC  #L1313.0000000123.CGNMC 
#L1313.12345.CGNMC  #L1313.0000.CGNMC 
#L1313.12345678910.CGNMC#L1313.12345678910.CGNMC 

SQL> 
0

我用了更新,INSTR和SUBSTR

update table set column_name= case 
when (instr(column_name,'.',1,2)-instr(column_name,'.',1,1)-1)<10 then substr(column_name,0,instr(column_name,'.',1,1))||lpad(substr(column_name,instr(column_name,'.',1,1)+1,instr(column_name,'.',1,2)-instr(column_name,'.',1,1)-1),10,'0')||substr(column_name,instr(column_name,'.',1,2)) 
end 
; 

檢查

select substr('L1313.0000002.CGNMC',0,instr('L1313.0000002.CGNMC','.',1,1))||lpad(substr('L1313.0000002.CGNMC',instr('L1313.0000002.CGNMC','.',1,1)+1,instr('L1313.0000002.CGNMC','.',1,2)-instr('L1313.0000002.CGNMC','.',1,1)-1),10,'0')||substr('L1313.0000002.CGNMC',instr('L1313.0000002.CGNMC','.',1,2)) from dual; 
0

我寫了一個函數,它會做工作演示下面的查詢,請檢查是否爲你工作。

SQL> create or replace function paddingstr1(inval varchar2) return varchar2 is 
    2  lval varchar2(100):=inval; 
    3  final_str varchar2(100); 
    4  str3 varchar2(100); 
    5  str2 varchar2(100); 
    6  str1 varchar2(100); 
    7  lpad_str varchar2(100); 
    8  pos1 int; 
    9  pos2 int; 
10  getval int; 
11  begin 
12  select instr(lval,'.') into pos1 from dual; 
13  select instr(lval,'.',1,2) into pos2 from dual; 
14  getval:=pos2-pos1-1; 
15  pos1:=pos1+1; 
16  select substr(lval,pos1,getval) into lpad_str from dual; 
17  select lpad(lpad_str,10,'0') into str2 from dual; 
18  select substr(lval,1,pos1-1) into str1 from dual; 
19  select substr(lval,pos2) into str3 from dual; 
20  final_str:= concat (str1,concat (str2,str3)); 
21  return final_str; 
22  end; 
23/

Function created. 

SQL> select paddingstr1('#L1313.0000002.CGNMC') from dual; 

PADDINGSTR1('#L1313.0000002.CGNMC') 
-------------------------------------------------------------------------------- 
#L1313.0000000002.CGNMC 

SQL> select paddingstr1('#LAD313.002.ERGH') from dual; 

PADDINGSTR1('#LAD313.002.ERGH') 
------------------------------------------------------------ 
#LAD313.0000000002.ERGH