【问题标题】:Extract Substring in Comma Separated values in Postgresql在 Postgresql 中以逗号分隔值提取子字符串
【发布时间】:2020-07-30 17:07:03
【问题描述】:

Postgresql 中的两个变量:

V_VAR :='US185268001,US285268002,US385268005'; --Input
V_OUT := '001,002,005'; --Expected output to be stored

知道如何在 postgresql 中进行操作吗?每个逗号分隔值的最后 3 个字符。如何操作 V_VAR 变量以将输出作为 V_OUT 变量。

更新:

请注意:V_VAR 可以有任意数量的 CSV 列表。这里我有 3 个值用于示例目的。

谢谢, 卡提克

【问题讨论】:

  • CSV 列表中是否总是只有三个值?
  • 感谢您的快速回复。不,它可以是任意数量的 CSV 列表。
  • 现在我猜你看到了将 CSV 列表放在列中的问题 :)

标签: sql postgresql csv postgresql-9.1


【解决方案1】:

我们可以在这里尝试使用正则表达式替换:

SELECT
    col,
    REGEXP_REPLACE(col, '.*?([0-9]{3})(,|$)', '\1\2', 'g') AS col_out
FROM yourTable;

这里的策略是惰性匹配,直到匹配(并捕获)一组中每个代码的最后 3 位数字,以及第二组中的可选逗号。然后,我们只替换三位数字和可选的逗号分隔符。

注意:正如@BillKarvin 所指出的,存储非规范化 CSV 并不是最佳的数据库设计。如果可能,请考虑将每个代码放在单独的记录中。

【讨论】:

  • 我在考虑拆分到一个表然后聚合,但正则表达式更直接。
  • 我们有适当的设计。实际上,我在 XML 标记中获取这些数据。以前我只得到一个值,现在它被多个值改变了。所以我需要操纵数据以获得所需的输出。我的 Where 条件具有等号 (=) 符号,在此更改后,我会将其更改为 IN 运算符。 @BillKarwin
  • @Tim Biegeleisen 感谢您的回答。我尝试使用它,它给出的输出类似于(第一个值得到最后 3 位数字,接下来的 2 个值没有变化。
  • @Karthik 我最初的答案是针对 Oracle 的(您标记了许多不同的数据库)。我已经更新了 Postgres,在这种情况下,您需要将全局标志添加到 REGEXP_REPLACE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多