【问题标题】:Capturing particular part of Integer Value from part of a String value从字符串值的一部分捕获整数值的特定部分
【发布时间】:2020-08-25 17:48:42
【问题描述】:

我有一个像cust_attbr 这样的表,包含attbr 列,其值如下:

{"SRCTAXAMT":"11300",เอ็ก10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}

{"SRCTAXAMT":"11300", กรุงค10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}

........ ...  ...
{"SRCTAXAMT":"11300", กรุงค10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":" "}

因此,我必须编写一个仅获取 VAT_NUMBER 值的选择语句,例如:

0835546003122
0835546003122
.... ... ..
null

【问题讨论】:

  • 每一行都有一个 json 元素吗?花括号周围的双引号 - 表中的那些也是吗?你是哪个版本的?
  • 是的,每一行只有这样的值。

标签: sql regex oracle vertica


【解决方案1】:

使用您发布的示例数据:

SQL> select * From test;

        ID ATTBR
---------- ----------------------------------------------------------------------------------------------------------------
         1 "{"SRCTAXAMT":"11300",????10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}"
         2 "{"SRCTAXAMT":"11300", ?????10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}"
         3 "{"SRCTAXAMT":"11300", ?????10110","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":" "}"

这可能是一种选择:

SQL> select id,
  2    regexp_substr(regexp_substr(attbr, 'VAT_NUMBER":"(\d+)?'), '\d+$') vat
  3  from test;

        ID VAT
---------- --------------------
         1 0835546003122
         2 0835546003122
         3

SQL>

内部regexp_substr 返回VAT_NUMBER 后跟可选数字,而外部仅提取锚定到前一个子字符串末尾的数字。

【讨论】:

    【解决方案2】:

    如果您使用的是 18c 并且数据是实际的 json(目前不是因为大括号和“,.กรุงค10110”周围的双引号引起的 - 目前尚不清楚这是因为您的示例数据) 你可以使用 json_table 函数:

    WITH t (json_val) AS
    (
      SELECT '{"SRCTAXAMT":"11300","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}' FROM DUAL UNION ALL
      SELECT '{"SRCTAXAMT":"11300","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":"0835546003122"}' FROM DUAL UNION ALL
      SELECT '{"SRCTAXAMT":"11300","TAXAMT":"11300","LOGID":"190301863","VAT_NUMBER":" "}' FROM DUAL
    )
    SELECT jt.*
    FROM   t,
           JSON_TABLE(json_val, '$'
             COLUMNS (first_name    VARCHAR2(50 CHAR) PATH '$."VAT_NUMBER"')) jt;
    
    0835546003122
    0835546003122
     
    

    【讨论】:

      【解决方案3】:

      一种选择是将这些列值转换为 JSON 语法,然后提取 VAT_NUMBER 键的值,前提是 DB 版本为 12c Release 1+。在这里,我们有一个无法识别的字符的问题,可能是来自远东的字母并且这些字符串没有正确引用,那么我们需要删除直到TAXAMT键的部分,然后通过前缀提取VAT_NUMBER键的值使用JSON_VALUE()函数打开花括号('{'):

      SELECT JSON_VALUE(
                        '{'||REGEXP_REPLACE(str,'(.*10110",)(.*)','\2'),
                        '$.VAT_NUMBER'
                        ) AS VAT_NUMBER        
        FROM tab  --> your original data source
      

      Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多