SQLの検索ついて

解決


Fibe  2004-02-18 07:21:41  No: 111871  IP: [192.*.*.*]

VB6.0でSQLを作成し検索を行いたいのですがどのようにコーディングしたら
よいか悩んでます。

検索する項目はコンボボックスで指定する形にしています。
項目数は複数(0〜6つぐらいです。)

例えば・・・
コンボボックス1は項目Aを選択
コンボボックス2は項目Bを選択
コンボボックス3は項目Cを選択

上記の場合は
strSQL=""
strSQL=strSQL & "select * from TableA Where"
strSQL=strSQL & "A='コンボボックス1の内容'
strSQL=strSQL & "AND B ='コンボボックス2の内容'
strSQL=strSQL & "AND C ='コンボボックス3の内容'

ですが、コンボボックス1のみ条件指定時、コンボボックス1と3のみ条件指定時
といろいろパターンが出できます。
それをうまく判断(If文等)して効率よくSQL文を作りたいのですがどのようにしたらよいのでしょうか?

ご教授願えないでしょうか。

編集    削除
魔界の仮面弁士  2004-02-18 07:25:39  No: 111872  IP: [192.*.*.*]

一例として。

SQL = "SELECT〜〜〜"
SQL = SQL & "WHERE 1=1"  'または、絶対に指定する事になっている条件
If コンボ1の選択時 Then
   SQL = SQL & " AND 列1=" & コンボ1の値
End If
If コンボ2の選択時 Then
   SQL = SQL & " AND 列2=" & コンボ2の値
End If
  :
  :
  :

編集    削除
Fibe  2004-02-18 07:33:22  No: 111873  IP: [192.*.*.*]

魔界の仮面弁士さんありがとうございます。

1=1とはどういう意味があるのでしょうか?

編集    削除
魔界の仮面弁士  2004-02-18 08:07:31  No: 111874  IP: [192.*.*.*]

例えば、
  SELECT * FROM テーブル WHERE 1=0
だと、0件のレコードを返す事になりますし、
  SELECT * FROM テーブル WHERE 1=1
なら、全レコードが返される事になりますよね。
(1=0は常にFalse、1=1は常にTrueですから)


> 1=1とはどういう意味があるのでしょうか?
WHERE文の最初に指定する『必須条件』を意味しています。

例えば、「会社コードは必ずWHERE文に含める」という場合は、
  SQL = SQL & " WHERE 1=1" 
ではなく、
  SQL = SQL & " WHERE COMPANY=" & CompanyCode
のような条件でも良いです。


必須条件を最初に持ってきた理由は、「省略可能な条件」の追加を、
   If 条件指定時 Then
     SQL = SQL & " AND 列=" & 値
   End If
の3行で済ませるためです。


もし、必須指定の条件が先頭に含まれていないとしたら、
最初の条件だけは、『 AND 』演算子をSQL中に含ませる事ができないので、
コードが少々煩雑になってしまいます。

  Dim hasCondition As Boolean   '条件を1つでも指定していればTrue
  hasCondition = False

  SQL = "SELECT 〜 FROM 〜"
           :
           :
  If コンボ3の選択時 Then
     If hasCondition Then
        SQL = SQL & " AND 列3=" & コンボ3の値
     Else
        hasCondition = True
        SQL = SQL & " WHERE 列3=" & コンボ3の値
     End If
  End If
  If コンボ4の選択時 Then
     If hasCondition Then
        SQL = SQL & " AND 列4=" & コンボ4の値
     Else
        hasCondition = True
        SQL = SQL & " WHERE 列4=" & コンボ4の値
     End If
  End If
    :
    :

………まぁ他にも、書き方は何通りもあるでしょうけれどね。(^_^;)

編集    削除
魔界の仮面弁士  2004-02-18 08:22:46  No: 111875  IP: [192.*.*.*]

> ………まぁ他にも、書き方は何通りもあるでしょうけれどね。(^_^;)

あるいは、『 AND 』を常に付けておくようにして、
最後にそれを除去するという手もあります。


SQL1 = "SELECT 〜 FROM 〜"
SQL2 = ""

    :
    :
If コンボ3選択時 Then
   SQL2 = SQL2 & " AND 列3 = " & コンボ3の値
End If
If コンボ4選択時 Then
   SQL2 = SQL2 & " AND 列4 = " & コンボ4の値
End If
    :
    :


If SQL2 = "" Then
   SQL = SQL1 & " ORDER BY 〜"
Else
   'Mid関数を使って、最初のANDを除去
   SQL = SQL1 & " WHERE" & Mid(SQL2, 5)  & " ORDER BY 〜"
End If

編集    削除
Fibe  2004-02-18 08:24:46  No: 111876  IP: [192.*.*.*]

ありがとうございます。

Boolean型の変数を使用すれば簡単に分岐ができるのですね。
わかりやすい説明ありがとうございます。

編集    削除
Fibe  2004-02-18 08:28:13  No: 111877  IP: [192.*.*.*]

なるほど、SQL2 = "" に常に追加していき最後にANDを削除する方法もあるのですね。

いろいろ方法がありそうですのでちょっと考えてみます。

編集    削除