Oracle Regex 从字符串中的键值对中获取值
Oracle Regex grabbing value from key value pair in a string
考虑以下列行:
col
-------------------------
'{"day":"8","every":"2"}'
我正在尝试使用正则表达式从该字符串中获取 8 来确定日期。
到目前为止我有:
SELECT
regexp_replace(col, '{"day":[^0-9]', '') as "day"
FROM
mytable;
这给了我:
day
---------------
8","every":"2"}
我无法弄清楚如何从第一个数字向前过滤掉字符串的其余部分。在我的示例中,我只想要此行的数字 8。
这个怎么样?
SELECT
regexp_replace(col, '{"day":"([0-9]+).*', '') as "day"
FROM
mytable;
如果您有幸使用 Oracle 12c Release 1 (12.1.0.2) 或更高版本,请务必查看 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
如果您无权访问 JSON_VALUE()
那么我会推荐以下正则表达式,除非您始终知道 JSON 字符串中 day
键的位置:
SELECT REGEXP_REPLACE(col, '^.*"day":"(\d+)".*$', '') AS day
FROM mytable;
这会将整个字符串(假设它匹配!)替换为第一个捕获组的内容(括在括号中:(\d+)
)。 \d
表示一个数字0-9
。如果您还想 return NULL 值,可以将 \d+
替换为 \d*
。如果负数或非数字值是可能的,那么我会推荐以下内容:
SELECT REGEXP_REPLACE(col, '^.*"day":"([^"]*)".*$', '') AS day
FROM mytable;
这将 return day
键中可能包含的任何字符。
仅供参考,一旦您获得数值,无论是数值还是非数值,您都可以使用 TO_NUMBER()
和 REGEXP_SUBSTR()
:
将其安全地转换为数值
SELECT COALESCE( TO_NUMBER( REGEXP_SUBSTR( REGEXP_REPLACE( col, '^.*"day":"[^"]*".*$', '' ), '\d+' ) ), 0 ) AS day
FROM mytable;
希望对您有所帮助。
考虑以下列行:
col
-------------------------
'{"day":"8","every":"2"}'
我正在尝试使用正则表达式从该字符串中获取 8 来确定日期。
到目前为止我有:
SELECT
regexp_replace(col, '{"day":[^0-9]', '') as "day"
FROM
mytable;
这给了我:
day
---------------
8","every":"2"}
我无法弄清楚如何从第一个数字向前过滤掉字符串的其余部分。在我的示例中,我只想要此行的数字 8。
这个怎么样?
SELECT
regexp_replace(col, '{"day":"([0-9]+).*', '') as "day"
FROM
mytable;
如果您有幸使用 Oracle 12c Release 1 (12.1.0.2) 或更高版本,请务必查看 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
如果您无权访问 JSON_VALUE()
那么我会推荐以下正则表达式,除非您始终知道 JSON 字符串中 day
键的位置:
SELECT REGEXP_REPLACE(col, '^.*"day":"(\d+)".*$', '') AS day
FROM mytable;
这会将整个字符串(假设它匹配!)替换为第一个捕获组的内容(括在括号中:(\d+)
)。 \d
表示一个数字0-9
。如果您还想 return NULL 值,可以将 \d+
替换为 \d*
。如果负数或非数字值是可能的,那么我会推荐以下内容:
SELECT REGEXP_REPLACE(col, '^.*"day":"([^"]*)".*$', '') AS day
FROM mytable;
这将 return day
键中可能包含的任何字符。
仅供参考,一旦您获得数值,无论是数值还是非数值,您都可以使用 TO_NUMBER()
和 REGEXP_SUBSTR()
:
SELECT COALESCE( TO_NUMBER( REGEXP_SUBSTR( REGEXP_REPLACE( col, '^.*"day":"[^"]*".*$', '' ), '\d+' ) ), 0 ) AS day
FROM mytable;
希望对您有所帮助。