Oracle 子字符串 (substrb) 在 space 上拆分
Oracle Substring (substrb) Split on space
我有两个字段,长度分别为 10 个字符和 40 个字符,名为 HOS_NAME
和 HOS_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'
- 在现有设计下,
HOS_NAME
为'GRACE MEMO'
,HOS_NAME1
为'RIAL HOSPITAL'
。
- 使用新设计后,
HOS_NAME
应为 'GRACE '
,HOS_NAME1
应为 '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
我有两个字段,长度分别为 10 个字符和 40 个字符,名为 HOS_NAME
和 HOS_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'
- 在现有设计下,
HOS_NAME
为'GRACE MEMO'
,HOS_NAME1
为'RIAL HOSPITAL'
。 - 使用新设计后,
HOS_NAME
应为'GRACE '
,HOS_NAME1
应为'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