2016-09-15 3 views
2

今日、私はSQL文に応じて簡単に(おそらくほとんどばかげた質問)尋ねます。可変条件のあるSQL

私はいくつかの条件がありますが、常にそれらのすべてを持つSELECTクエリを扱っています。私は例を使って説明します。

は...私は人のIDを取得したい[ID、名前、姓]

単純なテーブルの人を想像してみて、私はいつも名前を尋ねるが、常に姓を求めるない、そうだろう私はそれを得るために2つのとりうるコードを持っている

SELECT id FROM Person where name = $name; (if parameter surname = null) 

または SELECT id FROM Person where name = $name and surname = $surname;(パラメータ姓が定義されている場合)

を、私:クエリは、クエリは可能性が... PHPの関数のパラメータに依存しますそれが最適化されていないと思う

オプション1:

if ($surname) { 
    SELECT id FROM Person where name = $name and surname = $surname; 
else{ 
    SELECT id FROM Person where name = $name; 
} 

オプション2:

$sql = "SELECT id FROM Person where name = $name"; 
if ($surname) { $sql = $sql + " and surname = $surname"; } 

私は最良の選択肢は、パラメータが増加する可能性がしながら、第二の選択肢だと思うが、私はかどうかを知りませんクエリで導入する柔軟なパラメータは、nullパラメータに依存する可能性があります。

私の英語のために残念です。

ありがとうございます。

+1

'... name = $ nameと($ surname IS NULLまたはsurname = $ surname)'です。 – jarlh

+2

最良の解決策は、準備されたステートメントと@ jarlhを切り詰めたコードを使用することです – Jens

答えて

0

クエリを分割して連結することがあります:私が提供できる

$sql="SELECT * FROM Person WHERE 1=1"; 
if(isset($name)) 
{ 
     $sql.= " AND name='$name'";  
} 
if(isset($surname)) 
{ 
     $sql.= " AND surname='$surname'";  
} 
0

ベストソリューションです:

$sql = "SELECT id FROM Person WHERE name = $name and ($surname IS NULL or surname = $surname)"; 
+1

@jarlhがコメントと同じものを投稿したことがわかりました。 –

0

が求めていただき、ありがとうございます!これは非常に一般的な状況であり、Sanzeebの答えは最も一般的な対応です。しかし、貴方の貴重なSQLを細かく処理していることに注意してください。そして将来、どのリクエストが実際にあなたのDBに当たるかを見るために、デバッガを接続してSQLをトラップする必要があります。

より良いアプローチは、以下のように、SQLでそれをすべて行うことです...

var sql = @" 
SELECT id FROM Person where name = $name 
AND (surname = $surname or $surname is null) 
OPTION(RECOMPILE) 
"; 

リクエストの読みやすさが維持されています。この状況では、OPTION(RECOMPILE)が過剰である可能性がありますが、オプショナル・パラメーターには、指定されたパラメーターの組み合わせに対して最適化を行うために推奨されます。

さらに良いオプションは、QueryFirst .sqlテンプレートに上記の要求を貼り付け、SQLの無関心な誘惑をすべて取り除くことです。 QueryFirstが役立つ多くのものの中で、自動的にC#のnullをDBNull.Valueに変換します。つまり、SQLのNULLを変換します。