如何拆分数据到列在postgres sql?



我在表中有数据:

<表类> id 问题 tbody><<tr>11.1 Covid-19[例]21.1 Covid-19[死亡人数]

这样做的一种方法是使用非常有用的PostgreSQLSPLIT_PART函数,它允许您对字符进行拆分(在您的特定情况下,是空格)。只要您不需要最后一个字段的括号,您可以在左括号上分开,并使用RTRIM函数删除最后一个括号。

SELECT id, 
SPLIT_PART(question, ' ', 1)             AS questionid,
SPLIT_PART(question, ' ', 2)             AS question_name,
RTRIM(SPLIT_PART(question, '[', 2), ']') AS sub_question_name
FROM  tab

点击这里查看演示。

你可以在PostgreSQL官方的字符串函数相关文档中加深对这些函数的理解。


编辑:对于更高级的匹配,你应该考虑使用regex和PostgreSQL模式匹配:

SELECT id, 
(REGEXP_MATCHES(question, '^[d.]+'))[1]         AS questionid,
(REGEXP_MATCHES(question, '(?<= )[^[]+'))[1]      AS question_name,
(REGEXP_MATCHES(question, '(?<=[).*(?=]$)'))[1] AS sub_question_name
FROM  tab

Regex forquestionid

  • ^: start of string
  • [d.]+:任何现有的数字和点的组合

Regex forquestion_name说明:

  • (?<= ):
    • [^[]+:除[以外的任何字符的任何现有组合

    Regex forsub_question_name说明:

    • (?<=[):在匹配
    • 之前匹配一个左括号
    • .*:任意字符
    • (?=]$):正向前看,在match
    • 之后匹配一个右括号

    点击这里查看演示。

您也可以使用regexp_replace,在本例中,regexp_replace将替换方括号(第一组和第三组)第1组->^([),第3组->(])$由第二组(.*)。函数末尾的第三个参数2表示文本中应该保留哪个组。

select 
id,  
split_part(question, ' ', 1) p1,
split_part(question, ' ', 2) p2,
regexp_replace(split_part(question, ' ', 3), '^([)(.*)(])$', '2') p3
from 
covid;

下面是示例

最新更新