2013-02-20 74 views
5

私は質問があり、そのシンプルなものがあります(Gurusのために)。動的MySQLストアドプロシージャの句

SQLページングクラスをC#からMySQLストアドプロシージャに転置しています。私のC#自家製オブジェクトでは、クエリは条件に基づいて動的に構築されます。例:

if(keywords is not null) 
{ 
    whereClause += "WHERE description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
    whereClause += "AND price = '%price%'" 
} 

....今

string query = "SELECT col1, col2 FROM tblThreads " + whereClause 

、私の質問は:どのように私は次のようにMySQLでの動的where句をしますか?あるいは、もしそれらのパラメータに何も入力しなければ、ストアドプロシージャでMySQLにそれらをスキップする方法を教えてください。 IE:

SELECT col1, col2 FROM tblThreads 

これらのパラメータがnullの場合、

SELECT col1, col2 FROM tblThreads WHERE (IS NULL @keywords OR description like '%@keywords%' 

??

ありがとうございます。

答えて

1

あなたは彼らが全体のデータベースを照会することができている場合、最も簡単な方法は、ちょうどあなたが@keywordsの値、例えばをチェックするCASEステートメントを使用することができます

whereClause = "WHERE 1 = 1" 

if(keywords is not null) 
{ 
whereClause += "AND description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
whereClause += "AND price = '%price%'" 
} 
+0

私はこの1つが好きです。私は、私が "重い" SQL文の解析、つまりプログラム的にAND節を取り除かなければならないときに、これを自分で使います。以前の "AND"に戻り、その行を削除することができます。WHERE句を減らすことで、これははるかに簡単になります。 –

+0

これまでに一度これを見ましたが、それは私の元の質問に答えることはできませんが、面白いです。私は私のC#オブジェクトクラスに固執すると仮定すると、今私は "AND"を使用しているかどうかを識別しようとしています(私はブール変数を持っていますが、私が使用する瞬間にtrueに設定されています)。最初のパラメータをいつ使用したかを把握しておく必要がありますか?これにはパフォーマンス上の罰則がありますか?1 = 1は問題を引き起こしますか? –

+0

ここでいくつかの詳細を見てみましょう:http://stackoverflow.com/questions/8149142/where-1-1-statement 私は実際にこのアイデアが好きで、それを実装しようとします。ヒントをありがとう!私は最終的にこの方法を使って私のストアドプロシージャを構築することもできます。みんなありがとう。 –

2

のようなあなたの文の何かに1 = 1を追加することです。

SELECT col1, col2 
FROM tblThreads 
WHERE description LIKE CASE WHEN @keywords IS NULL 
          THEN description 
          ELSE CONCAT('%', @keywords, '%') 
          END 
     AND 
     price LIKE CASE WHEN @price IS NULL 
          THEN price 
          ELSE CONCAT('%', @price, '%') 
          END 
+0

すべてのパラメータがnullの場合はどうなりますか?悪い執行のためにそれができないだろうか? IE:説明LIKE '%%'と価格LIKE '%%' AND param3 LIKE '%%' AND ... paramX LIKE '%%'? –

+0

最後のコメントを無視します。私が1 = 1の方法をした場合、後でcase文を挿入して、 'CASE WHEN @price <> NULLの場合と価格のような値段% '' 私は推測しています...私は、それを試したことがないので、これは推測です。 –

0
SELECT col1, col2 
FROM tblThreads 
WHERE case when @keywords is not null then description like '%' + @keywords + '%' when @price is not null then price like'%' + @price + '%' end