Oracle Regex получает значение из пары ключ-значение в строке - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим следующую строку столбца:

col
-------------------------
'{"day":"8","every":"2"}'

Я пытаюсь получить 8 из этой строки, используя регулярное выражение для определения дня.

пока у меня есть:

SELECT 
    regexp_replace(col, '{"day":[^0-9]', '') as "day"
FROM 
   mytable;

Это дает мне:

 day
 ---------------
 8","every":"2"}

У меня проблемы с выяснением, как отфильтровать оставшуюся часть строки от первого числа вперед.В моем примере я просто хочу номер 8 для этой строки.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Если вам повезло использовать Oracle 12c, взгляните на JSON_VALUE

WITH t (s)
AS (
    SELECT '{"day":"8","every":"2"}'
    FROM DUAL
    )
SELECT JSON_VALUE(s, '$.day'  ) AS day
    ,  JSON_VALUE(s, '$.every') AS every
FROM t;

DAY   EVERY
---   -----
8     2
0 голосов
/ 10 мая 2018

Если у вас нет доступа к JSON_VALUE(), я бы порекомендовал следующее регулярное выражение, если вы не всегда знаете положение клавиши day в строке JSON:

SELECT REGEXP_REPLACE(col, '^.*"day":"(\d+)".*$', '\1') AS day
  FROM mytable;

Это заменит всю строку (при условии, что она совпадает!) С содержимым первой группы захвата (заключенной в круглые скобки: (\d+)). \d обозначает цифру 0-9. Если вы также хотите вернуть значения NULL, вы можете заменить \d+ на \d*. Если возможны отрицательные или нечисловые значения, я бы порекомендовал следующее:

SELECT REGEXP_REPLACE(col, '^.*"day":"[^"]*".*$', '\1') AS day
  FROM mytable;

Это вернет все символы, которые могут содержаться в клавише day.

К вашему сведению, если у вас есть значение, числовое или не имеющее значения, вы можете безопасно преобразовать его в число, используя TO_NUMBER() вместе с REGEXP_SUBSTR():

SELECT COALESCE( TO_NUMBER( REGEXP_SUBSTR( REGEXP_REPLACE( col, '^.*"day":"[^"]*".*$', '\1' ), '\d+' ) ), 0 ) AS day
  FROM mytable;

Надеюсь, это поможет.

0 голосов
/ 09 мая 2018

Как насчет этого?

SELECT 
    regexp_replace(col, '{"day":"([0-9]+).*', '\1') as "day"
FROM 
   mytable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...