PostgreSQL:根据分隔符将一个元素的数组拆分为多个元素并取消嵌套的查询
PostgreSQL: Query that splits array of one element into multiple elements based on a delimiter and unnest it
我是 PostgreSQl 的新手,我找不到解决方案来获得下面提到的输出。
我创建了一个 table,其中有一列数据类型为 text[],它是一个文本字符串数组(单个元素)。
我的 table 看起来像这样:
col1 col2
ID1 {"P25963(MI:0326), Homo sapiens);O14920(MI:0326), Homo sapiens)"}
ID2 {"Q8NFZ0(MI:0326), Homo sapiens);P12931(MI:0326), Homo sapiens)"}
ID3 {"P26368(MI:0326), Homo sapiens);Q15637(MI:0326), Homo sapiens); Q15638(MI:0326), Homo sapiens)"}
当我尝试访问 col2 的第一个和第二个元素时,我得到以下输出。
SELECT col2[1] FROM table;
P25963(MI:0326), Homo sapiens);O14920(MI:0326), Homo sapiens
Q8NFZ0(MI:0326), Homo sapiens);P12931(MI:0326), Homo sapiens
P26368(MI:0326), Homo sapiens);Q15637(MI:0326), Homo sapiens); Q15638(MI:0326), Homo sapiens
SELECT col2[2] FROM table;
NULL
NULL
NULL
我想将此数组元素拆分为多个元素 (存在 ;),取消嵌套它们,然后在未嵌套的行上执行一些正则表达式。
拆分后的期望输出为:
col1 col2
ID1 {P25963(MI:0326), Homo sapiens},{O14920(MI:0326), Homo sapiens}
ID2 {Q8NFZ0(MI:0326), Homo sapiens},{P12931(MI:0326), Homo sapiens}
ID3 {P26368(MI:0326), Homo sapiens},{Q15637(MI:0326), Homo sapiens}, {Q15638(MI:0326), Homo sapiens}
取消嵌套后所需的输出是:
col1 col3 col4
ID1 P25963(MI:0326), Homo sapiens O14920(MI:0326), Homo sapiens
ID2 Q8NFZ0(MI:0326), Homo sapiens P12931(MI:0326), Homo sapiens
ID3 P26368(MI:0326), Homo sapiens Q15637(MI:0326), Homo sapiens
ID3 P26368(MI:0326), Homo sapiens Q15638(MI:0326), Homo sapiens
任何建议都会很有帮助。
谢谢
我只想访问文本数组中的第一个元素并使用 split_part()
获取底层信息:
select
col1,
split_part(col2[1], ';', 1) col3,
split_part(col2[1], ';', 2) col4
from mytable
col1 | col3 | col4
:--- | :----------------------------- | :-----------------------------
ID1 | P25963(MI:0326), Homo sapiens) | O14920(MI:0326), Homo sapiens)
ID2 | Q8NFZ0(MI:0326), Homo sapiens) | P12931(MI:0326), Homo sapiens)
ID3 | P26368(MI:0326), Homo sapiens) | Q15637(MI:0326), Homo sapiens)
来自评论:如果您想拆分可变数量的元素,我建议将数据分散到行而不是列中。为此,您可以使用 string_to_array()
将字符串拆分为数组,然后 unnest()
生成行:
select
t.col1,
s.pos,
s.val
from mytable t
cross join lateral unnest(string_to_array(t.col2[1], ';')) with ordinality s(val, pos)
Demo:
col1 | pos | val
:--- | --: | :-----------------------------
ID1 | 1 | P25963(MI:0326), Homo sapiens)
ID1 | 2 | O14920(MI:0326), Homo sapiens)
ID2 | 1 | Q8NFZ0(MI:0326), Homo sapiens)
ID2 | 2 | P12931(MI:0326), Homo sapiens)
ID3 | 1 | P26368(MI:0326), Homo sapiens)
ID3 | 2 | Q15637(MI:0326), Homo sapiens)
ID3 | 3 | Q15638(MI:0326), Homo sapiens)
我是 PostgreSQl 的新手,我找不到解决方案来获得下面提到的输出。
我创建了一个 table,其中有一列数据类型为 text[],它是一个文本字符串数组(单个元素)。
我的 table 看起来像这样:
col1 col2
ID1 {"P25963(MI:0326), Homo sapiens);O14920(MI:0326), Homo sapiens)"}
ID2 {"Q8NFZ0(MI:0326), Homo sapiens);P12931(MI:0326), Homo sapiens)"}
ID3 {"P26368(MI:0326), Homo sapiens);Q15637(MI:0326), Homo sapiens); Q15638(MI:0326), Homo sapiens)"}
当我尝试访问 col2 的第一个和第二个元素时,我得到以下输出。
SELECT col2[1] FROM table;
P25963(MI:0326), Homo sapiens);O14920(MI:0326), Homo sapiens
Q8NFZ0(MI:0326), Homo sapiens);P12931(MI:0326), Homo sapiens
P26368(MI:0326), Homo sapiens);Q15637(MI:0326), Homo sapiens); Q15638(MI:0326), Homo sapiens
SELECT col2[2] FROM table;
NULL
NULL
NULL
我想将此数组元素拆分为多个元素 (存在 ;),取消嵌套它们,然后在未嵌套的行上执行一些正则表达式。
拆分后的期望输出为:
col1 col2
ID1 {P25963(MI:0326), Homo sapiens},{O14920(MI:0326), Homo sapiens}
ID2 {Q8NFZ0(MI:0326), Homo sapiens},{P12931(MI:0326), Homo sapiens}
ID3 {P26368(MI:0326), Homo sapiens},{Q15637(MI:0326), Homo sapiens}, {Q15638(MI:0326), Homo sapiens}
取消嵌套后所需的输出是:
col1 col3 col4
ID1 P25963(MI:0326), Homo sapiens O14920(MI:0326), Homo sapiens
ID2 Q8NFZ0(MI:0326), Homo sapiens P12931(MI:0326), Homo sapiens
ID3 P26368(MI:0326), Homo sapiens Q15637(MI:0326), Homo sapiens
ID3 P26368(MI:0326), Homo sapiens Q15638(MI:0326), Homo sapiens
任何建议都会很有帮助。
谢谢
我只想访问文本数组中的第一个元素并使用 split_part()
获取底层信息:
select
col1,
split_part(col2[1], ';', 1) col3,
split_part(col2[1], ';', 2) col4
from mytable
col1 | col3 | col4 :--- | :----------------------------- | :----------------------------- ID1 | P25963(MI:0326), Homo sapiens) | O14920(MI:0326), Homo sapiens) ID2 | Q8NFZ0(MI:0326), Homo sapiens) | P12931(MI:0326), Homo sapiens) ID3 | P26368(MI:0326), Homo sapiens) | Q15637(MI:0326), Homo sapiens)
来自评论:如果您想拆分可变数量的元素,我建议将数据分散到行而不是列中。为此,您可以使用 string_to_array()
将字符串拆分为数组,然后 unnest()
生成行:
select
t.col1,
s.pos,
s.val
from mytable t
cross join lateral unnest(string_to_array(t.col2[1], ';')) with ordinality s(val, pos)
Demo:
col1 | pos | val :--- | --: | :----------------------------- ID1 | 1 | P25963(MI:0326), Homo sapiens) ID1 | 2 | O14920(MI:0326), Homo sapiens) ID2 | 1 | Q8NFZ0(MI:0326), Homo sapiens) ID2 | 2 | P12931(MI:0326), Homo sapiens) ID3 | 1 | P26368(MI:0326), Homo sapiens) ID3 | 2 | Q15637(MI:0326), Homo sapiens) ID3 | 3 | Q15638(MI:0326), Homo sapiens)