【问题标题】:How can I use column reference in REGEXP_REPLACE in Oracle?如何在 Oracle 的 REGEXP_REPLACE 中使用列引用?
【发布时间】:2019-01-18 01:39:38
【问题描述】:

我的脚本如下所示:

SELECT
    regexp_replace(column1,'"resId":([^"]+?)..','"resId":column2,"')
FROM
    table;

在这里,我需要将 column1 中的 resId 值替换为 column2 中的值。

【问题讨论】:

  • 您可能希望包含表定义、一些示例数据和预期结果。就目前而言,您的问题并不是特别清楚。
  • 可能在您的 column2 上使用 REGEXP_SUBSTR 提取所需的值,然后在 regexp_replace 中使用它。
  • 请检查我的回答,如果它对您有帮助,请接受它或为给定的解决方案提供相关反馈(cmets)。请阅读:stackoverflow.com/help/someone-answers 以了解为什么它很重要。

标签: database oracle oracle11g oracle12c


【解决方案1】:

如果没有样本数据和预期输出,很难判断您到底想要什么。

您似乎希望转换这样的模式 - "resId":Value1,"otherid":othervalue

请注意,我考虑到了一个键值对 "resID":value 存在于数据中,并且此类键值对之间存在分隔符(空格或逗号)。

(,|$) 表示value 之后的逗号分隔符或行尾。您可以将其更改为在您的数据中包含任何能够将其与其他组合区分开来的分隔符。如果没有这样的东西并且数据比这更纯粹,您应该注意通过编辑您的问题清楚地描述它,这可能有助于我们为您提供适当的解决方案。

SQL Fiddle

查询

SELECT column1,
       column2,
       regexp_replace(column1,'"resId":[^"]+(,|$)','"resId":' || column2 || '\1') as replaced
FROM t

Results

|                             COLUMN1 | COLUMN2 |                            REPLACED |
|-------------------------------------|---------|-------------------------------------|
| "resId":Value1,"otherid":othervalue |  Value2 | "resId":Value2,"otherid":othervalue |
| "otherid":othervalue,"resId":Value1 |  Value2 | "otherid":othervalue,"resId":Value2 |

【讨论】:

    【解决方案2】:

    column2 值连接到您的替换字符串中:

    SELECT regexp_replace(
             column1,
             '"resId":([^"]+?),"','"resId":' || column2 || ',"'
           )
    FROM   table;
    

    但是,如果您的数据是格式正确的 JSON,并且 "resId" 值将是一个简单的文字(不是数组或对象),那么您可以使用正则表达式来解析:

    '("resId":)(null|true|false|(-?0|[1-9]\d*)(\.\d*)?([eE][+-]?\d+)?|"(\\["\/bfrnt]|\\u\d{4}|[^"\/'||CHR(8)||CHR(9)|| CHR(10)||CHR(12)||CHR(13)||'])*")'
    

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE table_name ( column1, column2 ) AS
      SELECT '{"resId":null}', 1 FROM DUAL UNION ALL
      SELECT '{"resId":true}', 2 FROM DUAL UNION ALL
      SELECT '{"resId":false}', 3 FROM DUAL UNION ALL
      SELECT '{"resId":123}', 4 FROM DUAL UNION ALL
      SELECT '{"resId":""}', 5 FROM DUAL UNION ALL
      SELECT '{"resId":"\r\n"}', 6 FROM DUAL UNION ALL
      SELECT '{"resId":"test"}', 7 FROM DUAL UNION ALL
      SELECT '{"resId":"' || CHR(13) || CHR(10) || '"}', 8 FROM DUAL;
    

    查询 1

    SELECT column1,
           column2,
           regexp_replace(
             column1,
             '("resId":)(null|true|false|(-?0|[1-9]\d*)(\.\d*)?([eE][+-]?\d+)?|"(\\["\/bfrnt]|\\u\d{4}|[^"\/'||CHR(8)||CHR(9)|| CHR(10)||CHR(12)||CHR(13)||'])*")',
             '\1' || column2
           ) As repl
    FROM   table_name
    

    Results

    |          COLUMN1 | COLUMN2 |           REPL |
    |------------------|---------|----------------|
    |   {"resId":null} |       1 |    {"resId":1} |
    |   {"resId":true} |       2 |    {"resId":2} |
    |  {"resId":false} |       3 |    {"resId":3} |
    |    {"resId":123} |       4 |    {"resId":4} |
    |     {"resId":""} |       5 |    {"resId":5} |
    | {"resId":"\r\n"} |       6 |    {"resId":6} |
    | {"resId":"test"} |       7 |    {"resId":7} |
    |       {"resId":" |       8 |     {"resId":" | -- Note: not well-formed JSON 
    |               "} |         |             "} | -- so did not get matched.
    

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 2021-10-05
      • 2015-06-15
      • 2016-05-23
      • 1970-01-01
      • 2016-10-25
      • 2019-10-20
      • 2018-08-14
      • 2018-08-05
      相关资源
      最近更新 更多