Ruby on rails postgresql部分和全部

Ruby on rails postgresql部分和全部,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,所以我试图得到两个不同的值。已支付全部款项的发票和已支付部分款项的发票。 这是一个rails应用程序 Invoices has_many :payments 付款方式为“已支付:真”或“已支付:假”。 因此,在我第一次打电话时,我想获得所有付款的发票的发票id。我试过: SELECT DISTINCT (invoices.id) FROM "invoices" join payments on payments.invoice_id = invoices.id WHERE "invoices"

所以我试图得到两个不同的值。已支付全部款项的发票和已支付部分款项的发票。 这是一个rails应用程序

Invoices has_many :payments
付款方式为“已支付:真”或“已支付:假”。 因此,在我第一次打电话时,我想获得所有付款的发票的发票id。我试过:

SELECT DISTINCT (invoices.id) FROM "invoices" join payments on payments.invoice_id = invoices.id WHERE "invoices"."payer_id" = 1 AND (payments.paid = ALL(array[true]))
不幸的是,即使三分之二的人已付款,这也会为发票返回一行:true

下一个调用是获取发票,其中一些已支付:true,一些已支付:false。为此,我尝试过:

SELECT DISTINCT (invoices.id) FROM "invoices" join payments on payments.invoice_id = invoices.id WHERE "invoices"."payer_id" = 1 AND (payments.paid = SOME(array[true]) AND payments.paid = SOME(array[false]))
但这不会返回一行,即使该发票中的某些付款已支付,而其他付款未支付

我是否正确使用了全部和部分?还是有别的办法打这个电话?这似乎是一个相当直截了当的电话,所以我相信有办法做到这一点。谢谢你们的帮助

=ALL(array[…])
表示等于数组的所有元素,当数组只有一个元素时,它相当于一个简单的相等测试

因此
payments.payment=ALL(数组[true])
相当于
payments.paymed=true

根据类似的逻辑,
payments.paymed=SOME(array[false])
相当于
payments.paymed=false

此查询似乎不需要或不需要数组和所有/部分数组。可以这样表示:

“使用paid=false查找没有相应付款的发票”

另一种表达方式:

“查找付款计数等于付款计数且p.paid=true的发票(表示已全部付款)”

p.paid::int
在p.paid为true时计算为1,在p.paid为false时计算为0

对于另一个查询,您可以使用
having
子句。
例如
拥有sum(P.paid::int)啊,太完美了,谢谢你,我没有想到拥有。从MySql切换到PG,我发现这很困难。愚蠢的赫罗库。
select distinct I.id
from invoices I
where payer_id=1
and not exists (select 1 FROM payments P WHERE P.invoice_id=I.id AND P.paid=false);
select I.id
from invoices I join payments P on (I.id=P.invoice_id)
group by I.id
having sum(P.paid::int)=count(*);