在PostgreSQL中,我有一个receipt_id列,其中包含逗号分隔的值或单个值。
我需要将第三列中的值与另一个名为Voucher的表一起使用。
我使用了split_part。
select ap.document_no AS invoice_number,
ap.curr_date AS invoice_date,ap.receipt_id,split_part(ap.receipt_id::text, ','::text, 1),
split_part(ap.receipt_id::text, ','::text, 2)
from ap_invoice_creation ap , voucher v
where (v.voucher_id::text IN
( SELECT split_part(ap_invoice_creation.receipt_id::text, ','::text, 1) AS parts
FROM ap_invoice_creation
WHERE ap_invoice_creation.receipt_id::text = ap.receipt_id::text
UNION
SELECT split_part(ap_invoice_creation.receipt_id::text, ','::text, 2) AS parts
FROM ap_invoice_creation
WHERE ap_invoice_creation.receipt_id::text = ap.receipt_id::text
UNION
SELECT split_part(ap_invoice_creation.receipt_id::text, ','::text, 3) AS parts
FROM ap_invoice_creation
WHERE ap_invoice_creation.receipt_id::text = ap.receipt_id::text)) AND ap.status::text = 'Posted'::text
但是这是查询的一部分,它需要更多的时间。因为整个查询需要更多的时间。
有没有其他办法来处理这件事?
2条答案
按热度按时间nuypyhwy1#
理想情况下,你甚至不应该这样存储CSV。也就是说,这里不需要
SPLIT_PART()
和大而丑陋的联合。考虑一下这个版本:sqserrrh2#
提高性能的一种方法是去除可怕的CSV值,并以适当的一对多关系存储数据。
如果无法做到这一点,可以使用EXISTS条件,而不是使用IN条件的交叉联接,后者使用三个查询: