Postgresql
PostgreSQL:將使用者定義的計算轉換為觸發器中的可執行計算
我希望將使用者定義的機器可讀字元串公式轉換為一組查詢和計算,然後將其結果保存在另一個非正常表中。計算將通過觸發器和通用/動態/靈活計算函式執行,這些函式將在某個表(下面簡單範例中的 bbg_pulls)被更新或插入時執行。
例如,如果傳入計算函式的字元串是:
'[bp2][-1]/[bp5]'
在哪裡
$$ bp# $$指定表(例如:bp = bbg_pulls)和 id 和$$ +/-# $$
now()
指定相對於 ID 左側的周期滯後(在我的範例中為天滯後) 。 然後查詢將類似於:select val1/val2 as fin_calc from (select val from bbg_pulls where id = 2 and val_date = (select (CURRENT_TIMESTAMP - INTERVAL '1 day')::date)) as val1 ,(select val from bbg_pulls where id = 5 and val_date = (select CURRENT_TIMESTAMP::date)) as val2
(請注意,以上所有內容都已構成,我無法測試查詢,因此它們可能在語法上關閉等。但希望您能理解我的觀點。)
我上面的例子只包括在同一個表中的兩個項目的劃分,但其他字元串可能要復雜得多,我需要合併諸如百分位等級、基本數學運算、絕對值等內容。
我們使用 PostgreSQL 9.3.5。為了清楚起見,上面的查詢被大大簡化了。
這裡的正確方法是什麼?倉庫/MDX/立方體解決方案?還是已經有類似的東西了?
我目前的方法/想法是遍歷我們使用的所有各種計算,並在 psql 中為每個計算定義一個單獨的查詢等,創建一些邏輯來找出所需的查詢/函式類型,並將 ID 作為參數傳遞給已辨識的特定查詢/功能。換句話說,不是一個可以進行任何字元串計算的通用計算生成函式,而是一組預定義函式和查詢,所有這些函式和查詢都必須單獨定義並在傳入的字元串公式中標識。計算,我們有很多。
如果這個問題無法回答,請告訴我,我會刪除它。
本質上,您是在問如何實現 基於專有的非規範查詢字元串生成動態 SQL的DSL
'[bp2][-1]/[bp5]'
。這是一項艱鉅的任務。我無法在這個媒體上回答這個問題,它遠非問答:“這就像我如何做這份工作。” 也就是說,這就是它的外觀。
'[bp2][-1]/[bp5]'
創建一個規範,說明您打算使用和支持哪種功能,以及您在問題中提供'([bp1]/[wc66])*[wc100]'
的眾多其他範例。- 創建解析器。這本身就是一門藝術。你打算使用正則表達式、樹解析器、薩克斯解析器嗎?您究竟需要什麼來滿足規範?
- 使用可以將解析的結構轉換為 SQL 的現成解決方案。大多數語言都有可以做到這一點的東西,比如SQL::Abstract。如果沒有,你必須創建它。