Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PostgreSQL中的逗号分隔字符串转换为具有匹配文本的列_Postgresql_Loops_Amazon Quicksight - Fatal编程技术网

将PostgreSQL中的逗号分隔字符串转换为具有匹配文本的列

将PostgreSQL中的逗号分隔字符串转换为具有匹配文本的列,postgresql,loops,amazon-quicksight,Postgresql,Loops,Amazon Quicksight,在我的表格字段中有一个逗号分隔的字符串(使用带有用户id的字符串\u AGG转换为逗号分隔的字符串)。希望在输出中将字符串分隔为单独的列。使用PostgreSQL有什么方法可以做到这一点吗 我无法对此使用CROSSTAB(),因为我正在Amazon QuickSight中运行查询,该查询不允许以下函数: 我尝试过使用SPLIT_PART(),但我不确定每一行中会有多少个值,我还希望每一列中都有相同的单词,或者如果该单词不在该行中,则为空。将各行转换为逗号分隔值的原始SQL为: SELE

在我的表格字段中有一个逗号分隔的字符串(使用带有用户id的字符串\u AGG转换为逗号分隔的字符串)。希望在输出中将字符串分隔为单独的列。使用PostgreSQL有什么方法可以做到这一点吗

我无法对此使用CROSSTAB(),因为我正在Amazon QuickSight中运行查询,该查询不允许以下函数:

我尝试过使用SPLIT_PART(),但我不确定每一行中会有多少个值,我还希望每一列中都有相同的单词,或者如果该单词不在该行中,则为空。将各行转换为逗号分隔值的原始SQL为:

    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”可以包含不同的名称
有什么方法可以通过循环(IF/WHERE/WHILE子句)或其他方式解决这个问题吗

更新2:

我需要的输出:

| 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?第二个问题是,该列中的名称相同,而不是不同的名称,如上面的示例所示。