- PR -

NULL検索

投稿者投稿内容
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-09-05 12:36
SQLの話だとは思うんですが

SELECT * FROM [table1] WHERE (([商品名] LIKE '%' + ? + '%') AND ([メーカー] LIKE '%' + ? + '%'))

で「商品名="たまご" メーカー=""」など、商品名だけで絞込みをかけたとき、商品名は入ってるけどメーカー名が入っていないレコードが無視されて表示されてしまいます。
というか、はじめから空白の要素を含むレコードは表示されません。

例:
|商品名|メーカー名|金額|
|たまご|A商事 |100 |
|たまご| |99 |
このテーブルを表示させるとメーカー名の入っていないレコードは表示されません

メーカー名を指定しない場合、メーカー名がNULLなレコードも、商品名さえ一致していれば、検索結果に反映させたいんですが、どのようにすればいいでしょう。

フォームの内容がNULLかどうかのチェックをかけてIF文で分岐させるのでしょうか?
それともSELECT文1行で上手く行く方法があるのでしょうか?
ろでおぼーい
会議室デビュー日: 2008/08/22
投稿数: 5
投稿日時: 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 '%' + ? + '%'))
泥爺
会議室デビュー日: 2007/12/03
投稿数: 8
投稿日時: 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の場合も検索対象になってしまいません?
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 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 '%' + ? + '%'))

)

うーーーん。
やっぱりうまく行かない。

単純そうなんだけどなぁ。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-05 18:31
「(商品名 が NULL かつ メーカー名 が 一致) または (商品名 が 一致 かつ メーカー名 が NULL) または (商品名 が 一致 かつ メーカー名 が 一致)」
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 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 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-09-06 09:48
引用:
SELECT * FROM [table1] WHERE (

((([商品名] is null) AND ([メーカー] is not null))
or
([商品名] LIKE '%' + ? + '%'))

AND

((([商品名] is not null) AND ([メーカー] is null))
or
([メーカー] LIKE '%' + ? + '%'))

)

これでもあってると思いますけどね。どういうケースでうまくいかないですか?

引用:
と、コードを書きました。
VWDだとIDの「keyword」「maker」の部分が「?」になるのでしょうが、VWDだと「?」がユニークではないのでどうif文を書けばいいのかわかりません。

開発環境の問題じゃなくてDBの問題ですよね。DBはAccessですか?
#Accessで同じパラメータを2回使う方法があれば私も知りたいです。

コードを書くんでもいいのならVWDでも当然できますよ。
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-09-06 22:05
その記述だと

商品名に「たまご」、メーカーが「A社」と入力したとき
商品名に「たまご」でかつ、メーカーが「A社」である商品を絞り込みたいのですが。

・商品名が「たまご」でかつメーカーが「NULL」
・商品名が「NULL」でかつメーカーが「A社」

のデータが混入します。

結局「?」がNULLかどうかがチェックしたいのですが、[商品名]や[メーカー名]をチェックしても意味ないのかな。

[ メッセージ編集済み 編集者: HM 編集日時 2008-09-06 22:09 ]

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