Как я могу использовать ссылку на столбец в regexp_replace в oracle?

Мой сценарий выглядит так:

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

Здесь мне нужно заменить значение resId в столбце 1 на значение из столбца 2.

Вы можете включить определение таблицы, некоторые образцы данных и ожидаемые результаты. В настоящее время ваш вопрос не особенно ясен.

mustaccio 10.08.2018 14:31

Вероятно, используйте REGEXP_SUBSTR в вашем столбце2, извлеките необходимое значение, а затем используйте его внутри regexp_replace.

Plirkee 10.08.2018 14:38

Пожалуйста, проверьте мой ответ и примите его, если он вам помог, или оставьте соответствующий отзыв (комментарий) по данному решению. Прочтите: stackoverflow.com/help/someone-answers, чтобы понять, почему это важно.

Kaushik Nayak 07.10.2018 17:43
0
3
78
2

Ответы 2

Без образцов данных и ожидаемого результата сложно сказать, что именно вы хотите.

Похоже, вы ожидаете преобразовать такой узор - "resId":Value1,"otherid":othervalue

Обратите внимание, я принял во внимание, что пара "ключ-значение" "resID":value существует в данных, и между такими парами ключ-значение есть разделитель (пробел или запятая).

(,|$) обозначает разделитель запятой или конец строки после value. Вы можете изменить это так, чтобы в ваших данных содержался любой разделитель, который отличает отличается от других комбинаций. Если такого нет и данные чище, чем эти, вам следует обратиться к опишите это четко, отредактировав свой вопрос, что может помочь нам предоставить вам правильное решение.

SQL Fiddle

Запрос:

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

Результаты:

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

Объедините значение 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

Результаты:

|          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.

Другие вопросы по теме