SQLクエリのwhere句でOracle SQLで以下のようなことをしたい
$p="All" then buildingname in(Building から buildingname を選択) else buildingname="$p"
問題は、この $p 変数を解析できないことです。つまり、変数に何が含まれているかを確認できません。
OR
条件が欲しいだけのように聞こえますが、
SELECT *
FROM sometable
WHERE ( :bind_variable = 'All'
AND buildingname IN (SELECT buildingname
FROM building))
OR buildingname = :bind_variable
文字列内の変数が含まれているものに置き換えられた場合 (したがって、バインド変数ではなく、PERL や PHP などの言語の変数であり、作成している選択文字列内で使用されます):
$selectstring = "SELECT *
FROM sometable
WHERE ( '$p' = 'All'
AND buildingname IN (SELECT buildingname
FROM building))
OR ( '$p' <> 'All' AND buildingname = '$p'"
SQL インジェクションの危険性に注意してください。バインド変数の方が優れています。とにかく、値「All」を含む変数 $p のステートメントは次のようになります
SELECT *
FROM sometable
WHERE ( 'All' = 'All'
AND buildingname IN (SELECT buildingname
FROM building))
OR ( 'All' <> 'All' AND buildingname = 'All')
「XYZ」を含む変数 $p の選択文字列がありますが、
SELECT *
FROM sometable
WHERE ( 'XYZ' = 'All'
AND buildingname IN (SELECT buildingname
FROM building))
OR ( 'XYZ' <> 'All' AND buildingname = 'XYZ')
しかし、正直なところ、次のようなこともできます
if ($p eq 'All') {
... one select
} else {
... another select
}
サブクエリで OR を使用できるため、$p が 'All' の場合は、建物の選択またはすべてを選択します。
buildingname in (Select buildingname from Building WHERE buildingname = $p OR $p = 'All')