- PR -

GridView 複数条件検索方法

投稿者投稿内容
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2007-10-23 17:16
症状ですが同じという意味です(期待な動きをしない)
どちらかに空白があればヒットさせれません下記
WHERE (●● LIKE '%' + ? + '%') OR (●● IS NULL)
クエリビルダのフィルタにLIKE '%' + ? + '%'をまたはにIS NULLを設定しました。
エラーはでません

ベルさん分かりにくく申し訳ありません。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-23 19:01
引用:
WHERE (●● LIKE '%' + ? + '%') OR (●● IS NULL)

質問1、最初の●●と後の●●って一緒ですか?別ですか?
わかりにくいのでそのままのせていただきたいです。

質問2、「どちらかに」とは、
a) パラメータとカラム値のどちらかに
b) 2つのカラムのどちらかに
のどちらですか?

このくらい複雑なクエリを書くならクエリビルダで「または」に設定とかじゃなくて
直接SQLを書いた方がいいですよ。

引用:
( (●● LIKE '%' + @param + '%') OR ( ●● IS NULL AND @param='' ) )
のようにしてしまいたいところですが、ACCESSで同じパラメータを2回使う方法を私は知りません。

私の書いた上記の条件は、これで1つのカラムに対する条件になります。
2つのカラムに対する条件にする場合は、
コード:
SELECT * FROM table1 WHERE 
( (カラム1 LIKE '%' + @param1 + '%') OR ( カラム1 IS NULL AND @param1='' ) ) 
AND
( (カラム2 LIKE '%' + @param2 + '%') OR ( カラム2 IS NULL AND @param2='' ) ) 


のようになるんじゃないですかね。(当方ではこのパラメータの書き方でも平気でした)

まずは、1つのカラムに対する条件で試してみて、期待する動作をするか試したらいいんじゃないですか?
(何かこないだもこう書いた気がする)
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2007-10-23 22:57
お返事ありがとうございます
■質問1(別にしています)
1カラム時
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE (社員名 LIKE '%' + ? + '%') OR
(社員名 IS NULL)
2カラム時
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE (社員名 LIKE '%' + ? + '%') AND (番号 LIKE '%' + ? + '%') OR
(社員名 IS NULL) AND (番号 IS NULL)


■質問2( b)でお願いします。 )
指定している列に空白があると空白のある行は表示してくれないのです。

SQL文ありがとうございます
実装してみました。
1カラム
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE ((社員名 LIKE '%' + @ param + '%') OR
(社員名 IS NULL AND @ param = ''))
エラーメッセージ
1 つ以上の必要なパラメータの値が設定されていません

2カラム
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE ((社員名 LIKE '%' + @ param1 + '%') OR
(社員名 IS NULL AND @ param1 = '')) AND
((番号 LIKE '%' + @ param2 + '%') OR
(番号 IS NULL AND @ param2 = ''))
エラーメッセージ
クエリ式 '((社員名 LIKE '%' + @ param1 + '%') OR (社員名 IS NULL AND @ param1 = '')) AND ((番号 LIKE '%' + @ param2 + '%') OR (番号 IS NULL AND @ param2 = ''))' の 構文エラー : 演算子がありません。

以上が実装結果です。
すみませんたぶんですが、パラメータで、なにか書かなきゃいけない???
あと、演算子のエラーも気になります。。。

よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-24 10:56
引用:
指定している列に空白があると空白のある行は表示してくれないのです。

「空白」とはどういうことを言っていますか?
1)カラムの値がNULL
2)カラムの値が長さ0の文字列(空文字)
3)カラムの値がスペースのみ
4)カラムの値がスペースを含む文字列(例:「山田 太郎」)

引用:
■質問1(にしています)
1カラム時
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE (社員名 LIKE '%' + ? + '%') OR
(社員名 IS NULL)

え、、同じなんじゃ、、、
この、「1カラム時」のクエリでも「空白」がある行を拾ってきませんか?
(ConvertEmptyStringToNullがfalseに戻ってたりしませんよね。。)
[追記]間違えた、、falseでいいんでした。。

「空白がある」とは[社員名]列に「ある」という意味であってますよね?

引用:
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE ((社員名 LIKE '%' + @ param + '%') OR
(社員名 IS NULL AND @ param = ''))
エラーメッセージ
1 つ以上の必要なパラメータの値が設定されていません

Name="param"となっているControlParameterをちゃんと用意してますか?

もしや@(アットマーク)とパラメータ名(param)の間にスペースを入れてますか?それであれば要りません。

複雑なことをやる場合はVisual Studioが自動でやってくれることにあまり頼らない方がいいですよ。

[ メッセージ編集済み 編集者: べる 編集日時 2007-10-24 23:25 ]
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2007-10-24 20:27
お返事ありがとうございます
>>1)カラムの値がNULL
はいその通りです
下記の内容は理解ができてませんが
>>2)カラムの値が長さ0の文字列(空文字)

>>え、、同じなんじゃ、、、
すみません同じでした。
>>この、「1カラム時」のクエリでも「空白」がある行を拾ってきませんか?
★すみません勘違いでした初期表示は空白okなんですが
検索実行後も空白を拾ってきます
>>(ConvertEmptyStringToNullがfalseに戻ってたりしませんよね。。)
以前助言を頂いたときはfalseにすると・・・??

>>「空白がある」とは[社員名]列に「ある」という意味であってますよね?
はい間違いないです。なんども実行し試しました

Name="param"となっているControlParameterをちゃんと用意してますか?
たしかに自動生成時は存在するのですがSQL直接入力となると存在しません
下記直接入力時
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DATAConnectionString2 %>"
ProviderName="<%$ ConnectionStrings:DATAConnectionString2.ProviderName %>" SelectCommand="SELECT ID, 社員名, 番号, 案内 &#13;&#10;FROM データーベース &#13;&#10;WHERE ((社員名 LIKE '%' + @param + '%') OR &#13;&#10;(社員名 IS NULL AND @param = '')) " CancelSelectOnNullParameter="False">
</asp:SqlDataSource>
下記自動生成時
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DATAConnectionString2 %>"
ProviderName="<%$ ConnectionStrings:DATAConnectionString2.ProviderName %>" SelectCommand="SELECT ID, 社員名, 番号, 案内 &#13;&#10;FROM データーベース &#13;&#10;WHERE (社員名 LIKE '%' + ? + '%') OR &#13;&#10;(社員名 IS NULL) " CancelSelectOnNullParameter="False">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" Name="?"
PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>



>>もしや@(アットマーク)とパラメータ名(param)の間にスペースを入れてますか?それ>>であれば要りません。
空白を取り除いても同じ症状です

やはり自動生成ではむりなのでしょうか?
初心者ですみません
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-24 23:45
引用:
>>この、「1カラム時」のクエリでも「空白」がある行を拾ってきませんか?
★すみません勘違いでした初期表示は空白okなんですが
検索実行後も空白を拾ってきます

そのようにSQLを書いているからです。
WHERE (社員名 LIKE '%' + ? + '%') OR (社員名 IS NULL)
としているので、パラメータの値にかかわらずNULLの項目は拾ってきます。

ここら辺が理解できていないならSQLをまず学んだ方が安全です。

引用:
>>(ConvertEmptyStringToNullがfalseに戻ってたりしませんよね。。)
以前助言を頂いたときはfalseにすると・・・??

ごめんなさい間違いました。falseでいいんでした。

引用:
やはり自動生成ではむりなのでしょうか?

無理なこともあります。全パターンのクエリが書けるとは限りません。
というか自動生成にこだわるところじゃないと思います。
自動生成でパラメータまで作っといて、クエリは手動で直す、とかが楽ですかね。
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2007-10-25 12:39
SQL文はこれでわかりましたが
SELECT ID, 社員名, 番号, 案内
FROM データーベース
WHERE ((社員名 LIKE '%' + @ param + '%') OR
(社員名 IS NULL AND @ param = ''))

ControlParameterの記述を教えていただければ幸いです。


べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-25 13:57
ControlParameterは自動生成で書かれるものと同じでいいんじゃないですかね。

というかマニュアルを。。
引用:
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.controlparameter(VS.80).aspx

スキルアップ/キャリアアップ(JOB@IT)