0

それが可能かどうか疑問に思っていましたが、確かにそうに違いありません。基本的に、ユーザー入力に基づいて条件付きで動的 SQL ステートメントを作成したいと思います (この例では、3 つのテキスト ボックス入力を使用します)。

var firstname = document.getElementById('firstname').value
var middle = document.getElementById('middle').value
var lastname = document.getElementById('lastname').value
var SQL

(3 つのフィールドがすべて入力されている場合...)

SQL = "SELECT * FROM TABLE WHERE [Firstname] = '" + firstname + "' AND [Middle] = '" + middle + "' AND [Lastname] = '" + lastname + "'"

(3 つのフィールドのうち 2 つが入力されている場合...)

SQL = "SELECT * FROM TABLE WHERE [Firstname] = '" + firstname + "' AND [Lastname] = '" + lastname + "'"

これを行うためのより良い方法はありますか?もっと短いもの?または、各フィールドのテキストを評価してから SQL を定義する必要がありますか?

ただ疑問に思っていましたが、尋ねるのは決して悪いことではありません。

ジェイ

4

3 に答える 3

0

これを絶対にしないでください。 パラメータ化されたクエリはあなたの友達です。

于 2012-11-01T15:45:09.703 に答える
0

値をパラメーターとしてクエリに渡すことができる場合

SQL = " SELECT * 
    FROM TABLE 
    WHERE (@firstName is null OR [FirstName] = @firstName) 
      AND (@middle is null OR [Middle] = @middle)
          AND (@lastName is null OR [Lastname] = @lastName"

これにより、キャッシュに 1 つのクエリ プランしか保存されないため、クエリ キャッシュのスパムも防止されます。

于 2012-11-01T15:40:18.930 に答える
0

そのようなものはうまくいくはずです...

SQL = "SELECT * FROM TABLE WHERE 

  1 =
  (
  case
     when LEN('" + firstname + "') > 0  and LEN('" + lastname + "') > 0 and LEN('" + middle + "') > 0 then ([Firstname] = '" + firstname + "' AND [Lastname] = '" + lastname + "' AND [Middle] = '" + middle + "')
     when LEN('" + firstname + "') = 0  and LEN('" + lastname + "') > 0 and LEN('" + middle + "') > 0 then ([Lastname] = '" + lastname + "' AND [Middle] = '" + middle + "')
     ...
  end
  )

またはより良い:

SQL = "SELECT * FROM TABLE WHERE 
(
  (LEN('" + firstname + "') > 0 AND [FirstName] = '" + firstname + "') 
 OR 
   LEN('" + firstname + "') = 0
) 
AND (same for secondName) 
AND (same for middle)"
于 2012-11-01T15:36:41.537 に答える