将PostgreSQL中的逗号分隔字符串转换为具有匹配文本的列
在我的表格字段中有一个逗号分隔的字符串(使用带有用户id的字符串\u AGG转换为逗号分隔的字符串)。希望在输出中将字符串分隔为单独的列。使用PostgreSQL有什么方法可以做到这一点吗 我无法对此使用CROSSTAB(),因为我正在Amazon QuickSight中运行查询,该查询不允许以下函数: 我尝试过使用SPLIT_PART(),但我不确定每一行中会有多少个值,我还希望每一列中都有相同的单词,或者如果该单词不在该行中,则为空。将各行转换为逗号分隔值的原始SQL为:将PostgreSQL中的逗号分隔字符串转换为具有匹配文本的列,postgresql,loops,amazon-quicksight,Postgresql,Loops,Amazon Quicksight,在我的表格字段中有一个逗号分隔的字符串(使用带有用户id的字符串\u AGG转换为逗号分隔的字符串)。希望在输出中将字符串分隔为单独的列。使用PostgreSQL有什么方法可以做到这一点吗 我无法对此使用CROSSTAB(),因为我正在Amazon QuickSight中运行查询,该查询不允许以下函数: 我尝试过使用SPLIT_PART(),但我不确定每一行中会有多少个值,我还希望每一列中都有相同的单词,或者如果该单词不在该行中,则为空。将各行转换为逗号分隔值的原始SQL为: SELE
SELECT
ss.ss_uuid,
STRING_AGG(mn.name, ', ') AS markers
FROM serial_state AS ss
JOIN marker_names AS mn
ON mn.s_uuid = ss.mn_s_uuid
GROUP BY ss.ss_uuid
查询1的输出:
| ss_uuid | markers |
| abcdefg | my,words,here |
| bcdefgh | words,my |
| fghijkl | my,here |
| opqrstu | here.my |
| xyzabcd | here,my,words |
| pqrstuv | words |
| restgte | my,you,here,i |
我已使用以下方法将其添加到一列中:
SELECT
split_part(markers, ',', 1) AS "Marker Name1",
split_part(markers, ',', 1) AS "Marker Name2",
split_part(markers, ',', 1) AS "Marker Name3"
FROM (
SELECT
ss.ss_uuid,
STRING_AGG(mn.name, ', ' ORDER BY mn.name) AS markers
FROM serial_state AS ss
JOIN marker_names AS mn
ON mn.s_uuid = ss.mn_s_uuid
GROUP BY ss.ss_uuid
) t
查询2的输出:
| Marker Name 1 | Marker Name 2 | Marker Name3 |
| my | words | here |
| words | my | |
| my | here | |
| here | here | |
| here | my | words |
| words | | |
| my | you | here | -- i is missing from this row
但该查询有两个问题,如上所述:
- 不知道字符串中有多少个单词,所以如果超过3个,那么我就漏掉了
- 由于初始“逗号分隔”字符串并不总是由相同的单词组成,“标记名称1”可以包含不同的名称
| Marker Name 1 | Marker Name 2 | Marker Name3 | Marker Name4 | Marker Name5 |
| my | words | here |
| my | words | |
| my | | here |
| | | here |
| | words | here |
| | words | |
| my | | here | you | i |
更新:
我是这样想的:
lenOfString = STRING_TO_ARRAY(flags);
FOR i IN lenOfString LOOP
SELECT
split_part(markers, ',', 1) AS "Flag Name"
FROM (
SELECT
ss.ss_uuid,
STRING_AGG(mn.name, ', ') AS flags
FROM serial_state AS ss
JOIN marker_names AS mn
ON mn.s_uuid = ss.mn_s_uuid
GROUP BY ss.ss_uuid, mn.name
) t
END LOOP
但这给了lenOfString一个错误
检查StackOverflow答案的来源:
regexp\u split\u to\u table
?我认为类似于@AkhileshMishra Nope,它需要创建一个存储过程,然后使用它。Alos,它还没有解决我的第二个查询:-(您正在寻找一个动态查询,这在直接的SQL语法中是不可能的。请详细说明您的第二点(举例)。@AkhileshMishra我在AWS(QuickSight)中使用它。因此,我无法使用存储过程之类的项。我可以创建一个数据集,然后使用该数据集,但其中的命令是否适用于PostgreSQL?第二个问题是,该列中的名称相同,而不是不同的名称,如上面的示例所示。