【问题标题】:Oracle, regexp_substr - how to match 'string'+regexOracle,regexp_substr - 如何匹配“字符串”+正则表达式
【发布时间】:2017-01-07 03:29:07
【问题描述】:

我有一列给我这样的行:

<?xml version="1.0" encoding="UTF-8"?>
<xSettings>
    <systemPropertyName>BLALBLA</systemPropertyName>
    <minimumAmount>198.00</minimumAmount>
    <closingAmount>198.00</closingAmount>
    <useThisSetting>true</useThisSetting>
    <SystemStep dayAfterPrevious="0">
        <System SystemService="1" minimumAmount="450.00" />
    </SystemStep>
    <SystemStep dayAfterPrevious="8">
        <message />
    </SystemStep>
    <SystemStep dayAfterPrevious="3">
        <block />
    </SystemStep>
    <SystemStep dayAfterPrevious="1">
        <message />
    </SystemStep>
    <SystemStep dayAfterPrevious="7">
        <message />
    </SystemStep>
</xSettings>

其中的所有数字都是可变的,BLA BLA 也是可变的。我想要的是一个只给我的选择

<minimumAmount>198.00</minimumAmount>

虽然这样会更好:

198.00

基本上,我不知道如何使用 regexp_substr 查找特定的字符串,然后返回一个数字,可能是 1 到 4 位数字,后面有两位小数。

【问题讨论】:

  • 正如 MT0 所说 - 不要使用正则表达式从 xml 字符串中提取值。这就像用锤子打螺丝一样;可以,但我们应该使用螺丝刀。

标签: oracle


【解决方案1】:

不要使用正则表达式来解析 XML 数据 - 使用适当的 XML 解析器:

SELECT x.minimumAmount
FROM   your_table t,
       XMLTable(
         '/xSettings',
         PASSING XMLType( t.your_column )
         COLUMNS minimumAmount NUMBER(5,2) PATH './minimumAmount'
       ) x

或者

SELECT TO_NUMBER(
         EXTRACTVALUE( XMLType( your_column ), '/xSettings/minimumAmount' )
       ) AS minimumAmount
FROM   your_table

【讨论】:

    【解决方案2】:

    不应该使用正则表达式来查询XML数据,但是这里:

    select
      regexp_substr(col, '<minimumAmount>(.*)</minimumAmount>',1,1,null,1) minimum_amount
    from your_table;
    

    另一种方法是像这样使用regexp_replace

    select
      regexp_replace(col, '.*<minimumAmount>(.*)</minimumAmount>.*','\1') minimum_amount
    from your_table;
    

    【讨论】:

    • 虽然这可行,但 MT0 是对的:不应该使用正则表达式函数来查询 xml 数据。
    • 看来我们会经常在这里“见面”,所以请注意:我并不总是对的;实际上我经常犯错!
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多