Nếu số lĩnh vực trong CSV là hằng số thì bạn có thể làm điều gì đó như thế này:
select a[1], a[2], a[3], a[4]
from (
select regexp_split_to_array('a,b,c,d', ',')
) as dt(a)
Ví dụ:
=> select a[1], a[2], a[3], a[4] from (select regexp_split_to_array('a,b,c,d', ',')) as dt(a);
a | a | a | a
---+---+---+---
a | b | c | d
(1 row)
Nếu số lĩnh vực trong CSV phải là không đổi sau đó bạn có thể nhận được số lượng trường tối đa bằng một cái gì đó như thế này:
select max(array_length(regexp_split_to_array(csv, ','), 1))
from your_table
và sau đó b liệt kê danh sách cột a[1], a[2], ..., a[M]
thích hợp cho truy vấn của bạn. Vì vậy, nếu ở trên cung cấp cho bạn tối đa 6, bạn sẽ sử dụng điều này:
select a[1], a[2], a[3], a[4], a[5], a[6]
from (
select regexp_split_to_array(csv, ',')
from your_table
) as dt(a)
Bạn có thể kết hợp hai truy vấn đó thành hàm nếu bạn muốn.
Ví dụ: đặt dữ liệu này (đó là một NULL ở hàng cuối cùng):
=> select * from csvs;
csv
-------------
1,2,3
1,2,3,4
1,2,3,4,5,6
(4 rows)
=> select max(array_length(regexp_split_to_array(csv, ','), 1)) from csvs;
max
-----
6
(1 row)
=> select a[1], a[2], a[3], a[4], a[5], a[6] from (select regexp_split_to_array(csv, ',') from csvs) as dt(a);
a | a | a | a | a | a
---+---+---+---+---+---
1 | 2 | 3 | | |
1 | 2 | 3 | 4 | |
1 | 2 | 3 | 4 | 5 | 6
| | | | |
(4 rows)
Kể từ delimiter của bạn là một chuỗi cố định đơn giản, bạn cũng có thể sử dụng string_to_array
thay vì regexp_split_to_array
:
select ...
from (
select string_to_array(csv, ',')
from csvs
) as dt(a);
Nhờ Michael cho lời nhắc về chức năng này.
Bạn thực sự nên thiết kế lại lược đồ cơ sở dữ liệu của mình để tránh cột CSV nếu có thể. Bạn nên sử dụng một cột mảng hoặc một bảng riêng biệt để thay thế.
Cảm ơn bạn sẽ kiểm tra và hoàn nguyên – Gallop
Xem xét sử dụng 'string_to_array' thay vì' regexp_split_to_array'; nó sẽ nhanh hơn vì nó không có chi phí xử lý biểu thức chính quy. – Michael
@Michael Bạn có thể thêm câu trả lời đó làm câu trả lời khác nếu muốn. Hoặc tôi có thể thêm 'string_to_array' như là một tùy chọn trong tôi, không chắc chắn làm thế nào tôi bị mất. –