0

これがストアドプロシージャなしで可能かどうかはわかりませんが、可能であることを願っています:

3 < x < 5データベースにorなどの情報を格納する列があります。 20 >= x >= 10# を に差し込んだ場合に式が true かどうかを評価する必要がありますx

現在、次のように、正規表現と eval の組み合わせを使用して、式が true かどうかを判断しています。

$evalExpression = '3<x<5';
$evalValue = 4;

preg_match("#^(.*?)(<=|>=|<|>)(.*?)(<=|>=|<|>)(.*?)$#", $evalExpression, $evalPieces);

if (eval("return {$range_pieces[1]} {$range_pieces[2]} $response && $response {$range_pieces[4]} {$range_pieces[5]};")) {
    return true;
}

ただし、SQL(MySQL) だけでこれを達成できる方法を見つけようとしています。例えば:

SELECT 3 < 4 && 4 < 5 FROM table X

これが可能かどうか誰にもわかりますか?このようなことを達成するには、ストアド プロシージャが必要でしょうか? 別のデータベース スキーマを使用するとこれが簡単になると確信していますが、私はこの構造を継承しており、スキーマを変更する前にニーズを達成できるかどうかを判断しようとしています。

ありがとう!

4

3 に答える 3

5

あなたが探している答えではないかもしれませんが、ここに情報を保存する方法を変更すると、データベースレベルでの評価が可能になります...

マジック ストリングは避け、代わりに各列の情報を明確にします

magic_string 
------------
3 < x < 5
20 >= x >= 10

なるかも

upper_bound | ub_inclusive | lower_bound | lb_inclusive
------------|--------------|-------------|---------------
5           |N             |3            |N
20          |Y             |10           |Y

そして、あなたのクエリは実行可能になります

SEL * FROM TABLE WHERE 
      (
         (x < upper_bound and ub_inclusive = 'N') OR 
         (x <= upper_bound and ub_inclusive = 'Y')
      ) AND (
         (x > lower_bound and lb_inclusive = 'N') OR 
         (x >= lower_bound and lb_inclusive = 'Y')
      )

*これは同じクエリの最適化されたバージョンです

SEL * FROM TABLE WHERE 
      (
         (x < upper_bound ) OR (x = upper_bound and ub_inclusive = 'Y')
      ) AND (
         (x > lower_bound ) OR (x = lower_bound and lb_inclusive = 'Y')
      )
于 2013-05-06T15:30:47.187 に答える
2

チェックの種類ごとに個別の列を使用してルールテーブルをモデル化することをお勧めします。各列は数値データ型であり、そのルールが適用されない場合は NULLS が許可されます。

例えば

CREATE TABLE RULES
(   RULE,ID
    ,EQUAL
    ,GREATER_THAN
    ,GREAR_THAN_EQUAL
    ,LESS_THAN
    ,LESS_THAN_EQUAL
)

上記の最初の例3 < x < 51|NULL|3|NULL|5|NULL

于 2013-05-06T15:31:15.273 に答える