Oracle Substring(substrb)在空间上拆分

时间:2015-01-19 20:51:35

标签: sql oracle substring

我有两个字段,长度为10个字符,长度为40个字符,分别为HOS_NAMEHOS_NAME1。 根据旧的要求,我需要在这两个字段中使用HOSPITAL_NAME。我使用

将前10个字符放在第一个字段(HOS_NAME)中,剩下的字符放在下一个字段中(HOS_NAME1
substrb(HOSPITAL_NAME, 0, 10) AS HOS_NAME, substrb(HOSPITAL, 11) AS HOS_NAME1 

但是,我需要满足一个新要求:如果在前10个字符中找到空格,则空格后的剩余字符应移动到下一个字段。那么,我怎样才能做到这一点?

示例:HOSPITAL_NAME'GRACE MEMORIAL HOSPITAL'

  • 在现有设计下,HOS_NAME'GRACE MEMO'HOS_NAME1'RIAL HOSPITAL'
  • 使用新设计时,HOS_NAME应为'GRACE 'HOS_NAME1应为'MEMORIAL HOSPITAL'

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

如果你的最后一部分永远不会(!)包含空格字符,你可以通过将-1传递给instr从右侧搜索第一个空格来获得你的分割位置:

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;

Specificly:

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只是为了删除找到的空格字符。

也许你应该考虑重构你的数据模型(在单独的列中存储单独的东西),以便在一次性清理后消除整个事件。

答案 1 :(得分: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