素人VBA備忘録第6回です。
例によって個人的な備忘録ですが、もしかしたら役に立つかもしれないので公開しています。
SQLでデータを引っ張ってくる際に出たエラーの話です。
「関係演算子が無効です」だと?意味わからん。
データベースから欲しいデータを引っ張ってくるときはSQLでやることが多いのですが、構文を間違えると当然ながらうまく持ってくることができません。
例えば一見正しそうな下の例、
"SELECT 取引先コード, 取引先名, " & _
"FROM マスタ1" & _
"WHERE "(取引区分 = '00') AND " & _
"(データ区分 <> '20') AND " & _
"(取引先コード = '30152' OR '30153') " & _
"ORDER BY 取引開始日, 取引先コード"
これでマクロを走らせると以下のエラーが返ってきます。
「関係演算子が無効です」???
とりあえず調べてみても AND とか OR の使い方がおかしいということ以外はわからず、上のコードのおかしさがわからない私には手詰まり感が半端ありませんでした。
AND や OR が複数出てくるとわかりにくいのは確かなので、なるべくカッコで括ってやるようにしていました。
それなのにおかしいと言われてもこちらとしては納得がいきません。
という逆ギレ状態のまま実行ボタンを連打しては跳ね返される時間を無為に過ごしていました。
やっとわかった解決法。SQLのANDとORは英語の接続詞じゃない!
何度実行ボタンを連打してもダメなものはダメなので、仕方なく色々と試してみた結果なんとか解決に至りましたので書き留めておきます。
先に正解を書いておくと、
"SELECT 取引先コード, 取引先名, " & _
"FROM マスタ1" & _
"WHERE "(取引区分 = '00') AND " & _
"(データ区分 <> '20') AND " & _
"(取引先コード = '30152' OR 取引先コード = '30153') " & _
"ORDER BY 取引開始日, 取引先コード"
これでうまくいきました。
間違っていたコードとの違いは下から2行目の OR のところです。
つまりSQLで条件を指定するときには、
A = B or C というつなぎ方はダメ
ということのようです。
英語の授業で習った接続詞は単語同士、句同士、節同士、文同士をつなぐことができましたが、SQLにおいて接続詞っぽい役割を果たす「AND」と「OR」は単語同士をつないでも前の句を受けてくれないということが判明しました。
A = B or A = C
という形で省略せずに書いてやらないといけなみたいです。
よくよく考えてみれば英語の接続詞で単語同士を接続しても本来は2つ目の単語の前には省略された句や節が存在するわけで、SQLではその省略を許さないということになるのでしょう。
スポンサーリンク
「関係演算子が無効です」エラーの一因まとめ。
今回出た「関係演算子が無効です」のエラーの原因は、ANDやORが単語同士をくっつけてくれない仕様のため出ていたようです。
もちろんこれだけが当エラーの原因ではないでしょうが、単純なコードでこれが出てしまいけっこうな時間を修正に費やしてしまいました。
結果大したことではありませんでしたが、この手の初歩的な問題ははネットで探してもなかなか見つからないのでこの記事を書いた次第でございますよ。
とにかくプログラムは日常の中で当たり前と思っているような前提が通用しない側面があります。
特に普通の英語だと思って接すると思わぬところで引っかかってしまうこともあるんですね。
「そんなバカなミスするのお前だけだろ」と思う方がほとんどでしょうが、ニッチなどなたかの役に立てば幸いでございますよ。
以上です!