SQL:条件SELECT

时间:2014-06-19 09:52:42

标签: sql postgresql

我使用以下SQL查询来接收超过payment_target天的所有条目。

 SELECT * from orders WHERE(EXTRACT(EPOCH FROM age(CURRENT_DATE,
 date_trunc('day', orders.created_at))) - orders.payment_target*86400 >= 0)

但是,我想以orders.invcoice_sent_at用作计算基础的方式修改此查询(如果它不为null)。否则,`orders.created_at'应该使用。

我尝试使用以下查询,但我猜它是比有效SQL更多的伪代码。我不知道如何设置要在语句块中使用的属性。

 SELECT  * from orders where (EXTRACT(EPOCH FROM age(CURRENT_DATE,
     date_trunc('day', IF orders.invoice_sent_at IS NOT NULL
 BEGIN orders.invoice_sent_at END
 ELSE 
 BEGIN orders.created_at END ))) - orders.payment_target*86400 >= 0)

3 个答案:

答案 0 :(得分:1)

您可以使用if而不是coalesce,它可以在支持ANSI SQL的每个数据库上运行:

 coalesce( orders.invoice_sent_at,  orders.created_at) - orders.payment_target*86400 >= 0)

答案 1 :(得分:0)

如果我正确理解您的问题,您可以使用声明的变量。 这也将使您的代码更具可读性。类似的东西:

DECLARE @DUEDATE DATETIME SET @DUEDATE = ISNULL(("从orders.invoice_sent_at获得价值"),("从orders.created_at&#34获取价值;)

在您的选择中使用@DUEDATE。

答案 2 :(得分:0)

SQL Fiddle

SELECT  *
from orders
where CURRENT_DATE - PaymentTarget > coalesce( InvoiceSent, Created );