5

ブール論理言語を SQL WHERE 句に変換するブール論理パーサーを作成する必要があります。

オペランドの順序は常に正しい順序になります (右側に値があります)。

これは比較的単純な例です。ネストされた括弧や NOT 演算子の使用などがある可能性があります。

(CACOUNT=01 OR CACOUNT=02 OR CACOUNT=03)
 AND Q4=1 AND NAME=TIMOTHY

WHERE 句は次のようになります。

WHERE (
     EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='01'
     )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='02'
  )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='03'
  )
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='Q4' AND b.Value='1'
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='NAME' AND b.Value='TIMOTHY'
)
4

3 に答える 3

2

WHERE の後に続くのはブール式なので、解析ではなく単純な置換による変換が必要です。サンプルの場合は、最後に引用符を付けるだけです: NAME='TIMOTHY'

于 2010-05-19T17:33:40.250 に答える
1

言語の文法を書き、再帰降下パーサーを作成します。これは、ブール式などの単純な「言語」を解析する最も簡単な方法です。

それを AST (抽象構文ツリー) に解析したら、必要な変換を行って、SQL WHERE 句を生成できます。

于 2010-05-19T18:01:00.763 に答える
0

編集後、すべてが変更されました。ロケット科学はまだ必要ありません。(\w+)=([\w\d]+) のような正規表現を書き、各一致を

EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)
于 2010-05-20T10:24:57.707 に答える