【问题标题】:changing type of column to array Postgresql将列类型更改为数组 Postgresql
【发布时间】:2021-04-01 21:34:42
【问题描述】:

我正在尝试将文本列转换为表中的数组 [文本] 列我有类似的列条目

['Nikolai Rimsky-Korsakov', 'Jascha Heifetz', 'Arpárd Sándor'] 但这是一种字符串或文本格式,我想将其转换为真正的字符串数组,以便我可以访问上列中的特定名称。 我尝试通过将类型设置为 text[] 来将类型从 this link 转换,但该列只是成为这样的数组的一个元素。

[ "['Nikolai Rimsky-Korsakov', 'Jascha Heifetz', 'Arpárd Sándor']" ]

但我想要的是为 tat 列键入 Array[text] 以便能够访问特定名称。

【问题讨论】:

  • 或者是否有可能在填充表时我可以将该列的类型设置为数组并自动将其作为数组
  • 我试过上面的部分,但结果和上面一样

标签: arrays postgresql casting


【解决方案1】:

使用函数translate()将方括号替换为大括号并删除单引号:

translate(str, '[]''', '{}')::text[]

查看Db<>fiddle.中的完整示例

【讨论】:

  • 我认为使用 translate 太危险了,因为它会替换所有出现的[]'。例如,您会得到名为“Sinéad O'Connor”的不良结果。
  • 您的解决方案出现同样的错误,它无法处理名称中的嵌套“”
  • @JuliusTuskenis - 很明显,实际的数据格式与良好的 SQL 标准相差甚远,我的回答是根据提供的数据样本就最简单的方法提出临时建议。问题应包含具有代表性的数据样本,并考虑所有特殊情况。
【解决方案2】:

PostgreSQL 文档的8.15.2. Array Value Input 部分描述了数组的一般外观

'{ val1 delim val2 delim ... }'

所以你需要修剪你的'['和']'字符并用'{'和'}'替换它们。

然后您可以转换为文本数组 (text[]) 并享受结果。

SELECT 
  replace(
    replace(
      '{'||trim(BOTH '[]' FROM test.sample)||'}',
      '\',
      '\\'
    ),
    '"', 
    '\"'  
  )::text[] AS names
FROM
(
  SELECT '[''Nikolai Rimsky-Korsakov'', ''Jascha Heifetz'', ''Arpárd Sándor'', ''Joe "Wingy" Manone'']'::text AS sample
) test

编辑 2

要处理输入中有" 和'' 字符的情况,我们必须使用\ 对其进行转义。

SELECT 
  replace(
    replace(
      '{'||trim(BOTH '[]' FROM test.sample)||'}',
      '\',
      '\\'
    ),
    '"', 
    '\"'  
  )::text[] AS names
FROM
(
  SELECT '[''Nikolai Rimsky-Korsakov'', ''Jascha Heifetz'', ''Arpárd Sándor'', ''Joe "Wingy" Manone'']'::text AS sample
) test

编辑 3

要从名称中删除引号:

  SELECT 
    replace( 
      replace(
        replace(
          '{'||trim(BOTH '[]''' FROM test.sample)||'}',
          '\', '\\' ),
        '"', '\"'),
      ''', ''', ',')::text[] AS names
  FROM
  (
    SELECT '[''Nikolai Rimsky-Korsakov'', ''Jascha Heifetz'', ''Arpárd Sándor'', ''Joe "Wingy" Manone'']'::text AS sample
  ) test

【讨论】:

  • 它在行 ERROR: malformed array literal: "{'Bunny Berigan', 'Gene Gifford And His Orchestra', 'Joe "Wingy" Manone'}" 上显示错误格式错误的数组文字
  • 我尝试使用 python 脚本更改 csv 文件,将 [] 替换为 {} 并将 ' 替换为 ",因此是否需要将单婴儿床替换为双床?
  • 由于嵌套的“Wingy”而出现错误,有什么方法可以处理它?
【解决方案3】:

通过在填充表格之前从我的 CSV 文件中删除嵌套方括号解决了这个问题,并且使用翻译功能稍作更改谢谢

    alter artist type text[] using translate(artist, '[]"', '{}')::text[] ; ```

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 2021-03-04
    • 2023-02-09
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2016-02-03
    • 2021-07-26
    相关资源
    最近更新 更多