これで問題はないのですが、少し手を入れると
次のようになるでしょうか。
Dim 名前 As String
Dim カナ As String
'万一、アポストロフィが入力された時の用心
名前 = Replace(txtName.Text, "'", "''")
カナ = Replace(txtKatakana.Text, "'", "''")
'以前の部分は省略
sSQL = ~
If 名前 <> "" Then
sSQL = sSQL & " WHERE 名前='" & 名前 & "'"
If カナ <> "" Then
sSQL = sSQL & " AND カタカナ='" & カナ & "'"
End If
Else
If カナ <> "" Then
sSQL = sSQL & " WHERE カタカナ='" & カナ & "'"
End If
End If
「*」ワイルドカードや、Like文を有効に使って試してみる。
SELECT * FROM テーブル名 WHERE カラム名 LIKE '[値]'
とか
SELECT * FROM テーブル名 WHERE カラム名 LIKE '*[値]*'
その環境で、
[値]が空のとき(*をセットしてでも)全件、
[値]があればその値に該当するもの、
になるかどうかを確認する。
うまくいけばSQLは1文で、空の判定も要らない。
引き渡すものを変えて、SQLは変えない方向はどうか。
参考までに挙げてみます。
(1)条件の内容(テキストボックスの中身)のA,Bは文字列
(2)2条件固定として、WHERE を使い、その中間はANDで結ぶ
と言う前提で、文字列を結合してなど色々やってみたが、私の力では、余りすっきりならなかった。
例えば一旦先に条件の文字列を結合して、場合により不要なx="やAND Y=を消そうとしたが、判りにくいだけのようだった。
ーー
ただしCase文を使うと、少し一瞬の可読性が上がるように思うが、どうだろう。
やはり場合分けを正面から、したほうがすっきりするようだ。
ーーー
私のテスト環境の関係でエクセルVBAでやってみた。条件文字列の出方だけのテストなので、あしからず。
ユーザーフォームにテキストボックスを2つ貼り付け。
コマンドボタン(キャプションは「検索実行」とでも、つけるべきか)を1つ貼り付け
そのクリックイベントに
Private Sub CommandButton1_Click()
test01
End Sub
標準モジュールに
(Case文のネスト)
Sub test01()
A = UserForm1.TextBox1.Text
B = UserForm1.TextBox2.Text
Select Case A
Case Is = ""
Select Case B
Case ""
MsgBox "エラー条件入力もれ"
Case Else
MsgBox "WHERE Y = " & B
End Select
Case Else
Select Case B
Case ""
MsgBox "WHERE X= " & A
Case Else
MsgBox "WHERE X = " & A & " AND Y=" & B
End Select
End Select
End Sub
Where以下の文字列だけを論じている。
SQL処理系によって、上記のAyaBの前後にシングルコーテーションや、ダブルコーテーションが必要なものがあると思うので
修正が必要。
SELECT・・FROM ZZZと最後の;は必要だが略している。
お礼
ありがとうございます。参考になりました。