算子串的長度,其他的我不得不從SQL字符串(的Oracle 11g)如何從一個字符在Oracle
從這個>>#L1313.0000002.CGNMC
這個>>更新字符串的長度#L1313.0000000002.CGNMC
我要計數的點之間的字符串的長度(。),如果它小於10,則我想附加多達零使它的10
計數字符串的整個長度是沒有幫助,因爲這些更改只能在子字符串中完成。
請幫
算子串的長度,其他的我不得不從SQL字符串(的Oracle 11g)如何從一個字符在Oracle
從這個>>#L1313.0000002.CGNMC
這個>>更新字符串的長度#L1313.0000000002.CGNMC
我要計數的點之間的字符串的長度(。),如果它小於10,則我想附加多達零使它的10
計數字符串的整個長度是沒有幫助,因爲這些更改只能在子字符串中完成。
請幫
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
您可以用組合做到這一點:
如何進行下面的查詢方式是:
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>
我用了更新,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;
我寫了一個函數,它會做工作演示下面的查詢,請檢查是否爲你工作。
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
您的解決方案不完整。 OP只想在點之間的substr長度小於10時才這樣做。 –
@LalitKumarB可能是的。這個問題沒有說明,如果點之間有多於10個字符的數據。在這種情況下,我會添加
CASE...WHEN ... ELSE
類似於您的示例 –是的,這是我想指出的。當字符串已經有超過10個字符時,你會強制它爲10.無論如何,希望它有助於:-) –