我在表中有数据:
这样做的一种方法是使用非常有用的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 for
sub_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;
下面是示例