Oracle 子字符串 (substrb) 在 space 上拆分

Oracle Substring (substrb) Split on space

我有两个字段,长度分别为 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个字符中找到space,那么space之后的剩余字符应该移动到下一个字段。那么,我该如何实现呢?

示例:HOSPITAL_NAME'GRACE MEMORIAL HOSPITAL'

我怎样才能做到这一点?

如果您的最后一部分从不(!)包含 space 字符,您可以通过将 -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;

具体来说:

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 只是为了去掉找到的 space 字符。

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

创建程序为:

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