【问题标题】:How to trim the text in different columns in OracleOracle中如何修剪不同列中的文本
【发布时间】:2019-05-07 02:03:46
【问题描述】:

我有一个来自数据库字段的字符串,其中包含以下格式的数据。可以存在UW:、Loading:、CBE: 字段。

ex1:

"[UW:Loading25,CBE]
[Loading: 100;120;130]
[CBE:150;170;190]"

ex2:

"[UW: CBE]
[CBE: 100;122;130]"

ex3:

"[UW:Loading25]
[Loading: 100;120;130]"

我必须将它们分隔在不同的列中,如下所述:

     UW       |    Loading     |  CBE  
--------------|----------------|------------
Loading25,CBE |  100;120;130   | 150;170;190
--------------|----------------|------------
CBE           |                |100;122;130 
--------------|----------------|------------
Loading25     |  100;120;130   |            

我该如何解决这个问题?

【问题讨论】:

    标签: sql regex oracle regexp-substr


    【解决方案1】:

    您可以将regexp_substr 与ltrim 一起用于每个搜索模式:

    with t(str) as
    (
     select '[UW:Loading25,CBE][Loading: 100;120;130][CBE:150;170;190]' from dual union all
     select '[UW: CBE][CBE: 100;122;130]' from dual union all
     select '[UW:Loading25][Loading: 100;120;130]' from dual  
    )
    select ltrim(regexp_substr(str,'UW:([^]]+)'),'UW:') as uw,
           ltrim(regexp_substr(str,'Loading:([^]]+)'),'Loading:') as loading,
           ltrim(regexp_substr(str,'CBE:([^]]+)'),'CBE:') as cbe
      from t;
    
    UW               LOADING        CBE
    -------------    -------------  ------------
    Loading25,CBE    100;120;130    150;170;190
    CBE                             100;122;130
    Loading25        100;120;130    
    

    在匹配模式时要注意Loading或CBE等重复词。

    【讨论】:

    • 嗨@Barbaros,上述解决方案不适用于某些场景,例如:[UW: CBE] [CBE: 100;122;130]。请问你能告诉我哪里错了
    • 嗨@Ashutosh,你是对的。我转换为上述完美无瑕的版本。
    • 谢谢。那行得通。你能告诉我一些链接来通过正则表达式,这样我就可以确定自己了。我还需要一些其他功能。
    • 不客气@Ashutosh。 Oracle Tutorial Link 是一个不错的来源,您可以在其中从右上方搜索那些字符串操作,例如 regexp_like、regexp_substr、regexp_count..等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多