2012-03-23 38 views
2

這是一個醜陋的。我希望我不必問這個問題,但是這個項目已經建成,我們正在處理數據庫中的大量驗證。實質上,我試圖建立一個函數,它將採用兩堆數據,將它們與未知批量的操作或比較器編織在一起,並生成一個長字符串。構造與SQL的遞歸比較

是的,這是措辭很差,所以我要舉個例子。我有一個可以有多個迭代的表單。出於某種原因,系統想要知道輸入的任何這些表單上的開始日期是否與這些表單上的輸入結束日期相同。不幸的是,由於系統的設計方式,所有內容都以字符串形式存儲,所以我必須先將它格式化爲日期,然後才能進行比較。下面是僞代碼,所以請不要糾正我對我的語法

輸入數據:

'logFormValidation("to_date(#) == to_date(^)" 
        , formname.control1name, formname.control2name)' 

現在,正如我所說,有這種形式的多次重複,我需要循環建立一個完全遞歸的比較(注意:它可能並不總是典型的布爾比較,它也可以在內部被稱爲函數,所以。或者類似的東西不會工作)。最後,我需要把它變成一個格式如下,所以驗證解析器可以讀取它。

OR(to_date(formname.control1name.1) == to_date(formname.control2name.1) 
    ,to_date(formname.control1name.2) == to_date(formname.control2name.1) 
    ,to_date(formname.control1name.3) == to_date(formname.control2name.1) 
    ,to_date(formname.control1name.1) == to_date(formname.control2name.2) 
    : 
    : 
    ,to_date(formname.control1name.n) == to_date(formname.control2name.n)) 

是的,這很醜陋......但考慮到我們的驗證解析器的工作方式,我沒有太多的選擇。有關如何完成這一任務的任何意見?我希望比雙遞歸循環更有效率,但除此之外沒有任何想法。

好吧,看到我的問題顯然非常不清楚,我將添加更多信息。我不知道我將在這些項目上進行什麼比較,我只是試圖將數據格式化爲適用於任何給定函數的東西。如果我要在數據庫之外這樣做,它會看起來像這樣。注意:僞代碼。 '#'是vals1函數中的位置標記,'^'是vals2的位置標記。

function dynamicRecursiveValidation(string functionStr, strArray vals1, strArray vals2){ 
    string finalFunction = "OR(" 
    foreach(i in vals1){ 
    foreach(j in vals2){ 
     finalFunction += functionStr.replace('#', i).replace('^', j) + ","; 
    } 
    } 
    finalFunction.substring(0, finalFunction.length - 1); //to remove last comma 
    finalFunction += ")"; 

    return finalFunction; 
} 

這就是我想要完成的。採用任何給定的比較器和兩個數組,並創建一個包含每種可能組合的字符串。鑑於我上面列出的替換字符,下面是可能的添加操作

# >^
to_date(#) == to_date(^) 
someFunction(#, ^) 
# * 2 - 3 <= ^/4 

所有我想要做的是生產,我稍後會執行字符串列表,我試圖做到這一點,而不必殺死服務器遞歸循環

+1

你會得到什麼輸入?你期待什麼樣的解決方案?你想從我們這裏得到什麼(除了我們對你的困境的同情嗎?) – APC 2012-03-23 17:47:21

+0

我正在尋找一種方法遞歸循環通過那個混亂,而不必寫一個雙循環。如果我堅持雙循環,那麼好吧...但我想嘗試找到一種替代方法來從「輸入」中產生'結果'。 – guildsbounty 2012-03-23 17:53:14

+0

@guildsbounty所以你想在Oracle函數中比較2個字符串日期列表 – tbone 2012-03-23 17:54:10

回答

0

我最終完成了數據的交叉乘積,並循環遍歷結果。這不是我真正想要的解決方案,但它工作。

1

我沒有一個解決方案的代碼,但你可以做算法如下

  1. 創建臨時表(start_date, end_date, formid)和任何現有的形式與每一個日期來填充它
  2. 獲取表單中的起始日期和簡單的:

    SELECT end_date, form_id FROM temp_table WHERE end_date = <start date to check>

  3. 對於反向

    SELECT start_date, form_id FROM temp_table WHERE start_date = <end date to check>

如果數據庫是可用的,爲什麼不讓它做所有的重吊裝。