• ベストアンサー

【SQL文】 where (colA & colB) in ((1 & 1), (2 & 2)) とは?

VB6のプログラムを読んでいたら、ACCESSのMDBにSQL文を 投げる際に以下のような記述がありました。 ------------------------------------------------------ select * from tableA where (colA & colB) in ((1 & 1), (2 & 2)) ------------------------------------------------------ これはどういったことを表しているのでしょうか? 雰囲気的には (colA, colB) の組み合わせが (1, 1) か (2, 2) というようなことを表しているのかなと思うのですが はっきりとわからなかったため質問させていただきました。 また、これはOracle等の他のDBでも使用できる構文 なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけたらと 思います。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.1

<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つではヒットするレコードが違います。 ちょっと、問題ありかと思います。

pocotan1
質問者

お礼

>>ただし、示されているコードはバグに近い書き方です。 なるほど、そうなんですか。 勉強になりました。 回答をありがとうございました。

その他の回答 (1)

回答No.2

#1さんの回答を見て、一言。 文字連結を「+」で行うのは、SQL Serverくらいではないかと思います。標準SQLや多くのRDBMSでは、「||」を使っていたと思います。 また、concatを使う(MySQLやDB2。使い方はまったく違う)などもあり、RDBMSによる違いが多い部分です。

pocotan1
質問者

お礼

文字連結はRDBMSによって違いが多いのですね。 調べてみたいと思います。 回答をどうもありがとうございました。

関連するQ&A