dポイントプレゼントキャンペーン実施中!

VB6のプログラムを読んでいたら、ACCESSのMDBにSQL文を
投げる際に以下のような記述がありました。

------------------------------------------------------
select * from tableA
where (colA & colB) in ((1 & 1), (2 & 2))
------------------------------------------------------

これはどういったことを表しているのでしょうか?

雰囲気的には
(colA, colB) の組み合わせが (1, 1) か (2, 2)
というようなことを表しているのかなと思うのですが
はっきりとわからなかったため質問させていただきました。

また、これはOracle等の他のDBでも使用できる構文
なのでしょうか?

ご存知の方がいらっしゃいましたら教えていただけたらと
思います。

A 回答 (2件)

<IN=集合>



WHERE節のキーワード INに値を列挙することで、その値を持つ列を抽出することができます。

<列名> [NOT] IN (<値1>,<値2>,...<値n>,)

SELECT * FROM 得意先一覧 WHERE 郵便番号 IN ('8300001', '8300002')

Informix、SQL Sever では、このように書きます。
ですから、構文としては共通した書き方です。
ただし、Access では、演算子をSQLのそれでなくVBAのそれが通用します。

・文字列の加算・・・&
・'11' と 11とで型照合エラーが発生しない。

などです。

ですから、Access 以外では、次のような書き方が一般的。

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+列2 IN ('1'+'1', '2'+'2')")
1;2;2;
2;1;1;

この場合、列1と列2の組合せが1+1、2+2 を取得しています。

ただし、示されているコードはバグに近い書き方です。

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+列2 IN ('11'+'11', '22'+'22')")
1;11;11;
2;22;22;
3;111;1;

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+'/'+列2 IN ('11/11', '22/22')")
1;11;11;
2;22;22;

この2つではヒットするレコードが違います。
ちょっと、問題ありかと思います。
    • good
    • 0
この回答へのお礼

>>ただし、示されているコードはバグに近い書き方です。

なるほど、そうなんですか。

勉強になりました。
回答をありがとうございました。

お礼日時:2007/09/04 22:38

#1さんの回答を見て、一言。



文字連結を「+」で行うのは、SQL Serverくらいではないかと思います。標準SQLや多くのRDBMSでは、「||」を使っていたと思います。
また、concatを使う(MySQLやDB2。使い方はまったく違う)などもあり、RDBMSによる違いが多い部分です。
    • good
    • 0
この回答へのお礼

文字連結はRDBMSによって違いが多いのですね。

調べてみたいと思います。

回答をどうもありがとうございました。

お礼日時:2007/09/04 22:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!