pgsql将列换成行
时间: 2024-09-30 13:14:55 浏览: 26
在PostgreSQL (pgsql) 中,如果你想要将表格的一列数据转换成行,可以使用表值函数(Table-Valued Function),或者简单地通过`UNION ALL`、`JSON_EXTRACT_PATH_TEXT` 或 `STRING_AGG` 函数结合`WITH ORDINALITY` 来实现。
1. **使用表值函数**:
如果你有一个包含记录的表,可以创建一个新的表函数,比如 `record_to_rows`,它接收一列作为输入并返回每个值作为一个新的行。
```sql
CREATE OR REPLACE FUNCTION record_to_rows(column_name text)
RETURNS SETOF text AS $$
BEGIN
RETURN QUERY SELECT column_name;
END;
$$ LANGUAGE plpgsql;
```
然后你可以像查询普通表一样调用这个函数:
```sql
SELECT * FROM record_to_rows('your_column');
```
2. **使用 `UNION ALL` 和 `WITH ORDINALITY`**:
如果你有静态的数据,可以使用 `UNION ALL` 和 `WITH ORDINALITY` 来添加顺序信息:
```sql
SELECT id, value,
ROW_NUMBER() OVER () - 1 AS row_number
FROM (
VALUES ('value1'), ('value2'), ('value3')
) t(value)
ORDER BY row_number;
```
这会把单列变成多行,并附上行号。
3. **使用 JSON 函数**:
如果你的数据存储为 JSON 格式,可以使用 `JSON_EXTRACT_PATH_TEXT` 结合 `ROW_TO_JSON` 转换:
```sql
SELECT jsonb_object_agg(jsonb_path_query(your_json_column, '$.column_name')::text, row_number()) AS converted_rows
FROM your_table
CROSS JOIN generate_series(1, array_length(your_json_column->>'$.column_name', 1)) AS row_num(row);
```
阅读全文