2017-10-21 76 views
0

我們在offers表中有許多字段確定要約的價格,但價格的關鍵組成部分是從外部API獲取的匯率。我們仍然需要按實際當前價格對報價進行分類。如何通過PostgreSQL中的計算列進行排序?

例如,假設我們在offers表中有兩列:exchangepremium_percentageexchange是外部請求的匯率來源的名稱。 premium_percentage由用戶設置。在這種情況下,如果不知道匯率,按當前價格對商品進行分類是不可能的,並且這可能根據exchange列中的內容而有所不同。

怎麼會這樣呢?有沒有辦法讓Postgres計算當前的價格,然後通過它來分類?

+0

編輯您的問題,並提供樣本數據和預期結果。 –

回答

2
SELECT 
    product_id, 
    get_current_price(exchange) * (premium_percentage::float/100 + 1) AS price 
FROM offers 
ORDER BY 2; 

請注意ORDER BY 2排序第二個序號列。

您可以改爲在ORDER BY子句中重複要排序的表達式。但是這可能會導致多重評估。

或者你可以將它全部包裝在一個子查詢中,這樣你就可以命名輸出列並在其他子句中引用它們。

SELECT product_id, price 
FROM 
(
    SELECT 
     product_id, 
     get_current_price(exchange) * (premium_percentage::float/100 + 1) 
    FROM offers 
) product_prices(product_id, price) 
ORDER BY price; 
+0

在ORDER BY子句中,您可以使用輸出列名稱,所以在第一個查詢中它也可以是'ORDER BY price'。 – klin

+0

@klin你試過了嗎?實際上你不能這樣做,因爲'price'不是任何表的列,它是'select'結果列表中計算列的別名。有些數據庫確實允許你這樣做,但它不是SQL標準,PostgreSQL也不是允許的。 –

+0

從[文檔:](https://www.postgresql.org/docs/current/static/sql-select.html)*輸出列的名稱可用於引用ORDER BY和GROUP BY中的列值子句... * [SqlFiddle。](http://sqlfiddle.com/#!17/6efb2/1) – klin

相關問題