【问题标题】:Oracle Substring (substrb) Split on spaceOracle 子字符串 (substrb) 在空间上拆分
【发布时间】:2015-01-19 20:51:35
【问题描述】:

我有两个长度为 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'

我怎样才能做到这一点?

【问题讨论】:

  • 澄清一下,HOS_NAMEHOS_NAME1 目前都存储在HOSPITAL_NAME 列中?如果第一个空格不在前 10 个字符内,那么 HOS_NAME 将是前 10 个字符,HOS_NAME1 是其余字符?
  • 顺便说一下,SUBSTRB() 会返回令人困惑的结果,因为它返回的是 bytes 而不是 characters。对于后者,您需要SUBSTR()

标签: sql oracle substring


【解决方案1】:

创建过程为:

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

【讨论】:

    【解决方案2】:

    如果您的最后一部分从不 (!) 包含空格字符,您可以通过将 -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只是为了去掉找到的空格字符。

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

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2022-11-17
      • 2020-12-01
      • 2014-02-15
      相关资源
      最近更新 更多