我有两个字段,长度为10个字符,长度为40个字符,分别为HOS_NAME
和HOS_NAME1
。
根据旧的要求,我需要在这两个字段中使用HOSPITAL_NAME
。我使用
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'
。我怎样才能做到这一点?
答案 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