- PR -

SELECT文の複合条件?設定の方法について

投稿者投稿内容
RedMania
会議室デビュー日: 2005/01/26
投稿数: 3
投稿日時: 2005-01-26 11:50
SQLServerを使用しております。
二つの条件を組み合わせたもの以外のデータを取得したいのですが、
どうもうまくいきません。
普通にWHERE句の後に条件書き込むだけで可能でしょうか?


SELECT column_A, column_B, column_C

条件は、column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの。
大きく分けて二つの条件ですが、別々に記述すると下記のようになると思います。

column_A <> 0
column_A = 1 AND column_B <> 0

これを素直に AND で連結すると
column_A = 1 AND column_B <> 0 のものしか表示されません。
かといって OR で連結すると
column_A <> 0 のものが表示され、column_A = 1 で column_B = 0 の値まで取得されてしまいます。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-01-26 12:00
引用:

条件は、column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの。


が、条件なのであれば、
引用:

これを素直に AND で連結すると
column_A = 1 AND column_B <> 0 のものしか表示されません。


の結果は正しいものだと思います。

( column_A <> 0 ) OR (column_A = 1 AND column_B <> 0 )
とやりたいのでしょうか? この場合は、「かつ」ではなくて「または」ですよ。
ちなみに、上記の条件は、正しく動作するかどうかは確認してません。
RedMania
会議室デビュー日: 2005/01/26
投稿数: 3
投稿日時: 2005-01-26 12:12
>Edossonさん
ご指摘ありがとうございます。
AND や OR で二つの条件を連結したのは無知な私の行動です。
( column_A <> 0 ) AND ( column_A = 1 AND column_B <> 0 ) や
( column_A <> 0 ) OR (column_A = 1 AND column_B <> 0 )
の結果が正しいものなのは私も把握しております。

私がお聞きしたいことはといいますと、
「column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの」
を取得する方法を教えて頂けないでしょうか?と言うことです。
説明が下手で申し訳ございません。


A B C
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 2 | 0 | 0 |

と言うデータがあった場合、

A B C
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 2 | 0 | 0 |

の三件を取得したいのです。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-01-26 12:28
引用:

RedManiaさんの書き込み (2005-01-26 12:12) より:

私がお聞きしたいことはといいますと、
「column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの」



言っておられることをそのまま普通に解釈すると、

column_A <> 0 AND column_A = 1 AND column_B <> 0

つまり

column_A <> 0 AND column_B <> 0

となってしまいます。

でも、きっとそういうことではないですよね。
もう少し、説明されたほうがよいように思います。

例も記述されているようですが、列 C については本文中で一切触れられていませんし。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-26 12:48
引用:

私がお聞きしたいことはといいますと、
「column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの」
を取得する方法を教えて頂けないでしょうか?と言うことです。
説明が下手で申し訳ございません。



永井です。

例から推察するに

column_A <> 0 AND NOT(column_A = 1 AND column_B = 0)

というイメージでしょうか?
#文章に合わせて書いてみました

#今SQL実行出来る環境にないので、これが通るかどうか分からないですが。
##自分でこういうイメージのSQLを書くときは後半括弧内部分の対偶を使うので、
##NOTって使ったことない……

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2005-01-26 12:52 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-01-26 12:59
返信作成中に永井さんの投稿に気がつきまして・・・。

「((column_Aが0)以外)または((column_Aが1)かつ(column_Bが0以外))」
と思っていましたが、
「(「column_Aが0」以外)
  または(((column_Aが1)かつ(column_Bが0))以外)」
でありましたか。

だとしたら・・・。
いろいろと文章をひねってみましたが、素の日本語での表現は確かに難しいですね。

追記:
私の解釈もおかしいようで・・・(汗
スレ汚しで申し訳ありません。m(_ _;m

[ メッセージ編集済み 編集者: Edosson 編集日時 2005-01-26 13:38 ]
hidemaru
常連さん
会議室デビュー日: 2004/03/22
投稿数: 44
投稿日時: 2005-01-26 13:19
この手の表現は、うまく表現しないと、正しく伝わりませんよね。
「column_Aが0以外かつcolumn_Aが1でcolumn_Bが0以外のもの」
これを、普通に解釈すると、あんとれさんがおっしゃる通り、
column_A <> 0 AND column_A = 1 AND column_B <> 0
となると思います。
でも、例から判断すると、次のように表現されるのではないでしょうか。

column_Aが0以外のもの
但し、column_Aが1の時は、column_Bが0以外のもの

このように表現すれば、もっと正しく伝わると思います。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-01-26 13:32
今日は。

引用:


A B C
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 2 | 0 | 0 |

と言うデータがあった場合、

A B C
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 2 | 0 | 0 |

の三件を取得したいのです。


で試しにtest(data1 number(3),data2 number(3),data3 number(3))で
テーブルを作って、oracle(9.2.0.6)で実験してみました。
以下の様に書くとお望みの物が取得できます。
(要は副問い合わせを使って一旦条件を絞り込みます)

select * from (select * from test where data1 <> 0 ) where data2 <> 0 or data1 >1

副問い合わせでdata1が0でない物を切り出し、そのデータに対し、data2が0でない
と言う事で
1,1,0と1,2,1が切り出され、
data1>1によって1.0.0が除外されます。

つまり
select * from test where data1 <> 0

1,0,0
1,1,0
1,2,1
2,0,0
が切り出され、

それに対しwhere句の
data2 <> 0

1,1,0
1,2,1
data1 >1

2,0,0
が選択されます。

これで良いかな? 

[ メッセージ編集済み 編集者: NAO 編集日時 2005-01-26 13:37 ]

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