我想使用类似于 LISTAGG 函数的东西,但跨列而不是行。也就是说,将满足特定条件的多列中保存的值连接到单个列中,并用分号 (;) 分隔。
表格数据示例:
身份证 | 第一天 | 第二天 | 第三天 | 第四天 |
---|---|---|---|---|
啊啊啊 | 弗兰克 | 无名 | 无名 | 鲍勃 |
啊啊啊 | 希拉 | 弗兰克 | 无名 | 扎克 |
我想返回这样的内容,忽略所有包含“无名称”的列:
身份证 | 列表 |
---|---|
啊啊啊 | 弗兰克;鲍勃 |
啊啊啊 | 希拉;弗兰克;扎克 |
我尝试过改编 LISTAGG,看看是否可以解决这个问题,但没有任何乐趣。
不确定我是否可以将 CONCAT 与条件一起使用,即忽略“无名称”,将它们从串联中排除
该表有一列代表一年中的每一天(365 或 366 列加上 ID),因此宁愿不要使用很长的 case 语句将所有值拉入单个字段。
生成动态sql查询
DO
$$
DECLARE
col_list TEXT;
BEGIN
-- Generate the dynamic column list with NULLIF for each column
SELECT string_agg('NULLIF(' || column_name || ', ''No name'')', ', ')
INTO col_list
FROM information_schema.columns
WHERE table_name = 'your_table'
AND column_name LIKE 'DAY%'; -- Assuming your columns are named DAY1, DAY2, etc.
-- Execute the dynamic query
EXECUTE 'SELECT ID, CONCAT_WS('';'', ' || col_list || ') AS LIST FROM your_table';
END
$$;