我有一个名为"程序创建"的数据库

    CREATE TABLE programs (
            name varchar(200) NOT NULL,
            role varchar(200) NOT NULL,
            section text[] NOT NULL,
            sub_section text[] NOT NULL,
            title text[] NOT NULL
            );
    INSERT INTO programs (name, role, section, sub_section, title) VALUES 
            ('John','Lead','{"VII","VII","VII"}','{"A","A","C"}','{"STUDY","STUDY","STUDY"}'), 
            ('Olga','Member','{"VII","VII"}','{"A","A"}','{"STUDY","STUDY"}'),
            ('Ben','Co-Lead','{"XI","X"}','{"A","B"}','{"STUDY","TRAVEL"}'),
            ('Ana','Member','{"VII","II","VI"}','{"A","ALL","B"}','{"STUDY","STUDY","TRAVEL"}');

这是桌子的样子

| name | role    | section      | sub_section | title                    |
| ---- | ------- | ------------ | ----------- | ------------------------ |
| John | Lead    | VII,VII,VII  | A,A,C       | STUDY,STUDY,STUDY        |
| Olga | Member  | VII,VII      | A,A         | STUDY,STUDY              |
| Ben  | Co-Lead | XI,X         | A,B         | STUDY,TRAVEL             |
| Ana  | Member  | VII,II,VI    | A,ALL,B     | STUDY,STUDY,TRAVEL       |

我想在小节、小节和标题列中找出不同的组合,并将其作为输出

| name  | role    | section.sub_section | title                    |
| ----  | ------- | ------------------- | ------------------------ |
| John  | Lead    | VII.A               | STUDY
| John  | Lead    | VII.C               | STUDY
| Olga  | Member  | VII.A               | STUDY
| Ben   | Co-Lead | XI.A                | STUDY
| Ben   | Co-Lead | X.B                 | TRAVEL
| Ana   | Member  | VII.A               | STUDY
| Ana   | Member  | II.ALL              | STUDY
| Ana   | Member  | VI.B                | TRAVEL

我对SQL相当陌生,我真的很难获得想要的输出.非常感谢您的帮助.

推荐答案

您所需的数据没有显示"跨节、子节和标题列的组合",似乎您需要根据位置匹配相应的数组,因此您可以只显示unnest个字段,并按要区分的字段分组.

假设相应的列包含varchar数组(如果不是,则需要使用一些字符串函数来转换它们):

-- sample data
WITH dataset (name, role, section, sub_section, title) AS (
    VALUES  ('John','Lead',array['VII','VII','VII'],array['A','A','C'],array['STUDY','STUDY','STUDY']), 
            ('Olga','Member',array['VII','VII'],array['A','A'],array['STUDY','STUDY']),
            ('Ben','Co-Lead',array['XI','X'],array['A','B'],array['STUDY','TRAVEL']),
            ('Ana','Member',array['VII','II','VI'],array['A','ALL','B'],array['STUDY','STUDY','TRAVEL'])

) 

--query
select name,
    role,
    sec || '.' || sub_sec "section.sub_section",
    t title
from dataset
    cross join unnest(section, sub_section, title) as t(sec, sub_sec, t)
group by name, role, sec, sub_sec, t
order by name

输出:

name role section.sub_section title
Ana Member VII.A STUDY
Ana Member II.ALL STUDY
Ana Member VI.B TRAVEL
Ben Co-Lead XI.A STUDY
Ben Co-Lead X.B TRAVEL
John Lead VII.A STUDY
John Lead VII.C STUDY
Olga Member VII.A STUDY

Sql相关问答推荐

LAG函数通过丢弃空值返回前一行

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

替换条件中的单元格值

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

从原始表列中经过JSON字符串化的对象数组构建视图

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

雅典娜嵌套Json提取液

你能过滤一个列表只返回多个结果吗?

Select 非重复值并按条件排除行

基于另一个(SAS、SQL)中的值更新列

PostgreSQL:查找继承表中的特定记录属于哪个表

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

YEAR 函数仍然不可SARGable 吗?

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

BigQuery数组是否包含NULL值的判断方法

在自引用表中使用分组和计数的SQL查询语句

条件意外地显着降低性能的地方

如果当前日期是一周中的某一天,则从另一天提取结果