sql - 使用 Postgresql 提取第二个找到的匹配子字符串

标签 sql regex postgresql substring

我使用下面的查询从存储 JSON 对象的列中提取值。

它的问题是,它只提取与 SUBSTRING 中的 regex 匹配的第一个值,即 -$4,000.00,是否有一个传递给 SUBSTRING 的参数以在另一列中提取值 -$1,990.00

SELECT attribute_actions_text
, SUBSTRING(attribute_actions_text FROM '"Member [Dd]iscount:":"(.+?)"') AS column_1
, '' AS column_2

FROM  (
   VALUES
     ('[{"Member Discount:":"-$4,000.00"},{"Member discount:":"-$1,990.00"}]')
   , (NULL)
   ) ls(attribute_actions_text)

期望的结果:

column_1        column_2  
-$4,000.00      -$1,990.00

最佳答案

试试这个

WITH data(id,attribute_actions_text) as (
  VALUES
      (1,'[{"Member Discount:":"-$4,000.00"},{"Member Discount:":"-$1,990.00"}]')
    , (2,'[{"Member Discount:":"-$4,200.00"},{"Member Discount:":"-$1,890.00"}]')
    , (3,NULL)
), match as (
  SELECT
    id,
    m,
    ROW_NUMBER()
    OVER (PARTITION BY id) AS r
  FROM data, regexp_matches(data.attribute_actions_text, '"Member [Dd]iscount:":"(.+?)"', 'g') AS m
)
SELECT
   id
  ,(select m from match where id = d.id AND r=1) as col1
  ,(select m from match where id = d.id AND r=2) as col2
  FROM data d 

结果

1,"{-$4,000.00}","{-$1,990.00}" 2,"{-$4,200.00}","{-$1,890.00}" 3,NULL,NULL

关于sql - 使用 Postgresql 提取第二个找到的匹配子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41032359/

相关文章:

sql - 如何检查表上持有哪些锁

sql - 使用 IN/INTERSECT、INNER JOIN 或 EXISTS 进行交叉查询?

sql - PL/SQL和SQL中VARCHAR2的最大大小是多少?

JavaScript 文本验证不适用于正则表达式

Javascript 替换不起作用?

sql - Rails 中 SQL 迁移的 updated_at 和 created_at 默认值有问题吗?

sql - postgresql/psql 查询 where 子句多个 "or"从文件读取

c# - NpgsqlCopyIn 因超时 ("CommandTimeout"设置而失败)

mysql - 尝试在 SQL 中为表创建外键时出错?

java - 匹配可能为 double 或不是 double 的可能负数