- - PR -
NULL検索
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-09-05 12:36
SQLの話だとは思うんですが
SELECT * FROM [table1] WHERE (([商品名] LIKE '%' + ? + '%') AND ([メーカー] LIKE '%' + ? + '%')) で「商品名="たまご" メーカー=""」など、商品名だけで絞込みをかけたとき、商品名は入ってるけどメーカー名が入っていないレコードが無視されて表示されてしまいます。 というか、はじめから空白の要素を含むレコードは表示されません。 例: |商品名|メーカー名|金額| |たまご|A商事 |100 | |たまご| |99 | このテーブルを表示させるとメーカー名の入っていないレコードは表示されません メーカー名を指定しない場合、メーカー名がNULLなレコードも、商品名さえ一致していれば、検索結果に反映させたいんですが、どのようにすればいいでしょう。 フォームの内容がNULLかどうかのチェックをかけてIF文で分岐させるのでしょうか? それともSELECT文1行で上手く行く方法があるのでしょうか? | ||||||||
|
投稿日時: 2008-09-05 13:03
NULL値はイコールや曖昧検索の条件から除外されます。
例えばオラクルなら 以下のように記載するか、 SELECT * FROM [table1] WHERE ( ([商品名] is not null and [商品名] LIKE '%' + ? + '%') or ([商品名] is null) ) AND ( ([メーカー] is not null and [メーカー] LIKE '%' + ? + '%') or ([メーカー] is null) ) もしくは、NULL値の場合、システム上有りえない値に変換しては如何でしょうか。 SELECT * FROM [table1] WHERE ((NVL([商品名],'@') LIKE '%' + ? + '%') AND (NVL([メーカー],'@') LIKE '%' + ? + '%')) | ||||||||
|
投稿日時: 2008-09-05 15:09
SELECT *
FROM [table1] WHERE ( ([商品名] is not null and [商品名] LIKE '%' + ? + '%') or ([商品名] is null) ) AND ( ([メーカー] is not null and [メーカー] LIKE '%' + ? + '%') or ([メーカー] is null) ) ↑だとどちらもNullの場合も検索対象になってしまいません? | ||||||||
|
投稿日時: 2008-09-05 18:15
いろいろ考えてみた。
SELECT * FROM [table1] WHERE ( ((([商品名] is null) AND ([メーカー] is not null)) or ([商品名] LIKE '%' + ? + '%')) AND ((([商品名] is not null) AND ([メーカー] is null)) or ([メーカー] LIKE '%' + ? + '%')) ) うーーーん。 やっぱりうまく行かない。 単純そうなんだけどなぁ。 | ||||||||
|
投稿日時: 2008-09-05 18:31
「(商品名 が NULL かつ メーカー名 が 一致) または (商品名 が 一致 かつ メーカー名 が NULL) または (商品名 が 一致 かつ メーカー名 が 一致)」
| ||||||||
|
投稿日時: 2008-09-05 18:53
うーん。
それを1行で書くのが難しいですね。 最適化の問題!? 「?」って、1回しか使えないですよねぇ。 ちなみにASPで書いたときは StrSQL = "select * from table1" If keyword <> "" And maker <> "" Then StrSQL = StrSQL & " where 商品名 like '%" & keyword & "%' " StrSQL = StrSQL & " and メーカー like '%" & maker & "%' " Else If keyword <> "" Then StrSQL = StrSQL & " where 商品名 like '%" & keyword & "%' " End If If maker <> "" Then StrSQL = StrSQL & " where メーカー like '%" & maker & "%' " End If End If と、コードを書きました。 VWDだとIDの「keyword」「maker」の部分が「?」になるのでしょうが、VWDだと「?」がユニークではないのでどうif文を書けばいいのかわかりません。 出来ればSQL文1行で書ければいいのですが。 [ メッセージ編集済み 編集者: HM 編集日時 2008-09-05 19:29 ] | ||||||||
|
投稿日時: 2008-09-06 09:48
#Accessで同じパラメータを2回使う方法があれば私も知りたいです。 コードを書くんでもいいのならVWDでも当然できますよ。 | ||||||||
|
投稿日時: 2008-09-06 22:05
その記述だと
商品名に「たまご」、メーカーが「A社」と入力したとき 商品名に「たまご」でかつ、メーカーが「A社」である商品を絞り込みたいのですが。 ・商品名が「たまご」でかつメーカーが「NULL」 ・商品名が「NULL」でかつメーカーが「A社」 のデータが混入します。 結局「?」がNULLかどうかがチェックしたいのですが、[商品名]や[メーカー名]をチェックしても意味ないのかな。 [ メッセージ編集済み 編集者: HM 編集日時 2008-09-06 22:09 ] |