2012-03-23 7 views
2

これは醜いものです。私はこの質問をする必要はありませんでしたが、プロジェクトはすでにデータベースで大量の検証を処理しているように構築されています。基本的には、私は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; 
} 

これは私が達成しようとしているすべてのものです。任意のコンパレータと2つの配列をとり、すべての可能な組み合わせを含む文字列を作成します。私は上記の置換文字を考えると、以下の可能な追加の操作

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

私は後で実行される文字列を生成しているやろうとしているすべての

のリストである、と私はなくても、それをやろうとしています再帰ループ

+1

どのようなインプットを得ますか?あなたは何の解決策を期待していますか? – APC

+0

ダブルループを書くことなく、その混乱を再帰的にループする方法を探しています。もし私がダブルループに悩まされていたら、大丈夫です。 ...しかし、私は '入力'から '結果'を生成する別の方法を見つけようとしています。 – guildsbounty

+0

@guildsbounty @ 2つの文字列日付のリストをOracle関数で比較したいですか? – tbone

答えて

0

私はデータのクロスプロダクトを実行し、結果をループしました。私が本当に望んでいた解決策ではありませんでしたが、うまくいきました。

1

にサーバーを殺すために私は、このためのソリューションコードを持っていないが、あなたは、アルゴリズム以下

  1. は一時テーブル(start_date, end_date, formid)を作成し、任意の既存のフォームからのすべての日付を移入しますすることができます
  2. データベースは、それがすべての重いをやらない理由を利用できる場合は逆

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

について

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

  • は、単にフォームからSTART_DATEとを取得します持ち上げる。

  • 関連する問題