2015-01-19 2 views
0

길이가 10 문자 40 자이고 길이가 HOS_NAMEHOS_NAME1 인 두 개의 필드가 있습니다. 이전 요구 사항에서이 두 필드 모두에 HOSPITAL_NAME을 넣어야했습니다. 나는 첫 번째 필드 (HOS_NAME)에 처음 10 개 문자를 넣고오라클 하위 문자열 (substrb) 공간에서 분할

substrb(HOSPITAL_NAME, 0, 10) AS HOS_NAME, substrb(HOSPITAL, 11) AS HOS_NAME1 

그러나, 나는 새로운 요구 사항을 충족해야 사용하여 다음 필드 (HOS_NAME1)에 남아 : 공간이 첫 번째 (10) 내에서 발견 된 경우 문자 다음에 공백 다음의 나머지 문자는 다음 필드로 이동해야합니다. 그래서, 어떻게 이것을 할 수 있습니까?

예 : HOSPITAL_NAME는 기존의 디자인에서 'GRACE MEMORIAL HOSPITAL'

  • 입니다 HOS_NAME'GRACE MEMO'HOS_NAME1'RIAL HOSPITAL'입니다.
  • 새로운 디자인으로 HOS_NAME'GRACE '이어야하고 HOS_NAME1'MEMORIAL HOSPITAL'이어야합니다.

어떻게하면됩니까?

+0

그냥 명확하게, 모두'HOS_NAME'와'HOS_NAME1' 현재 컬럼에 저장됩니다 'HOSPITAL_NAME'? 첫 번째 공간이 처음 10 자 이내가 아니라면'HOS_NAME'은 처음 10 자이고 나머지는'HOS_NAME1'입니까? –

+0

그건 그렇고,'SUBSTRB()'는 * 문자 *가 아닌 * bytes *를 반환하기 때문에 혼란스러운 결과를 반환 할 수 있습니다. 후자는'SUBSTR()'을 원한다. –

답변

0

으로 절차 만듭니다

CREATE OR REPLACE FUNCTION JCOLLECT.GET_SUB_STRING(STR IN VARCHAR2, STR_DELIMITOR IN VARCHAR2:='.',STR_PART IN VARCHAR2:='1') RETURN VARCHAR2 IS STR_RET VARCHAR2(4000):=NULL; BEGIN 
IF STR_PART = '1' THEN   
    STR_RET := substr(STR, 1, instr(STR,STR_DELIMITOR,1,1)-1);   
ELSE  
    STR_RET := substr(STR, instr(STR,STR_DELIMITOR,1,STR_PART-1)+1,instr(STR, STR_DELIMITOR, 1,STR_PART)- instr(STR, STR_DELIMITOR, 1,STR_PART-1)-1);   
END IF; RETURN STR_RET; END; 

그런 다음이처럼 사용할 수 있습니다

SELECT GET_SUB_STRING(COLUMN_NAME,',','1') FROM YOUR_TABLE

0

마지막 부분은 통과 -1 instr에 의해 오른쪽에서 최초의 우주 선두로부터 검색하여 분할 위치를 얻을 수있는 공간 문자를 포함하지 않는 경우 (!)는 : Specificly

select substr('GRACE MEMORIAL HOSPITAL' , 0 , instr('GRACE MEMORIAL HOSPITAL', ' ' , -1) - 1) HOS_NAME 
     ,substr('GRACE MEMORIAL HOSPITAL' , instr('GRACE MEMORIAL HOSPITAL', ' ' , -1)+1) HOS_NAME1 
from dual; 

을 :

select substr(HOSPITAL_NAME , 0 , instr(HOSPITAL_NAME, ' ' , -1) - 1) HOS_NAME 
     ,substr(HOSPITAL_NAME , instr(HOSPITAL_NAME, ' ' , -1)+1) HOS_NAME1 
from yourTable; 

추가 +1-1가 발견 공백 문자의 제거에 불과하다.

일회성 정리 후에 전체 사건을 없애기 위해 데이터 모델을 리팩터링 (별도의 열에 별도의 항목 저장)하는 것이 좋습니다.