【问题标题】:Convert array to rows in Postgres在 Postgres 中将数组转换为行
【发布时间】:2018-05-22 20:53:39
【问题描述】:

如果我在 SQL 语句 ('A','B','C') 中有这样的东西,我如何将它转换成这样的多行列

col
---
 A
 B
 C

我无法更改创建字符串的方式(因为它是从外部程序注入到 SQL 查询中的)。例如,我不能将其设为['A','B','C'](替换为方括号)。我可以在它周围包裹任何东西,比如[('A','B','C')] 或其他。

有什么帮助吗?

更新 1

我有 PostgreSQL 8.4.20

【问题讨论】:

  • @jpmc26 不,不是真的。就我而言,约束是我必须处理的确切 ('A','B','C') 字符串。
  • 我在你说什么之前撤回了接近投票,但它显然没有删除评论。
  • 您的 PG 版本尚未收到安全更新 for almost 4 years。更新到受支持的版本非常重要;这也将为您提供广泛的新功能。

标签: sql postgresql postgresql-8.4


【解决方案1】:

您可以从VALUES 创建一个ARRAY,然后将其取消嵌套:

SELECT 
    unnest(ARRAY[col_a, col_b, col_c]) 
FROM 
    (VALUES('A','B','C')) AS x(col_a, col_b, col_c)

结果:

| unnest |
|--------|
|      A |
|      B |
|      C |

编辑:您也可以像这样使用美元引号 ($$) 来调整 jspcal's answer,这样您就可以将字符串连接到 SQL 语句中:

  SELECT * FROM regexp_split_to_table(
    regexp_replace(
      $$('A','B','C','D','foo')$$,
      '^\(''|''\)+', '', 'g'),
      ''','''
    );

【讨论】:

  • 这个很有创意。我正在做更多的测试,但看起来很有希望...... :D 是否可以有可变数量的值?喜欢('A','B','C','D','E') 却事先不知道?
  • 此解决方案仅适用于固定数量的列。我仍在寻找更动态的解决方案。
  • 我添加了一个基于@jspcal 的答案的解决方案,但使用美元引号$$ 来引用您的字符串。
  • 太棒了。我们正在到达某个地方。不过,我的第一行是('A。有多余的('... 还在胡闹。
  • @HP。 select unnest(cast(translate($$( 'A','B','C','D','foo' )$$, '()''', '{}"') as text[]));dbfiddle.uk/…
【解决方案2】:

内置的regexp_split_to_table 函数将为您完成这项工作。由于您打算直接注入而不转义,因此请使用 thibautg's answer 中的 $$ (dollar quoting)。

select * from regexp_split_to_table(
    regexp_replace($$('A','B','C')$$, '^\(''|''\)+', '', 'g'),
    ''','''
);

【讨论】:

  • 如果我这样做select regexp_split_to_table('A B C', E'\\s+');,它将起作用。但我的原始字符串是('A','B','C')。那么如何把它变成'A B C'呢?
  • 你可以用regexp_replace去掉多余的字符。
  • 我无法将其更改为 (''A'',''B'',''C''),但我可以将其用引号括起来,例如 "('A','B','C')"
  • 看看上面将原始文本传递给函数的答案。
  • @HP。 REPLACEREPLACE(my_incoming_var, $$'$$, $$''$$)。如果您可以控制此处的 任何 代码(您必须让您的问题有 1% 的意义),那么您可以对字符串做任何您想做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多