質問: sqlのbetween句 sql初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(sqlは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にto_char(sysdate -2, 'yyyymmdd') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このsqlについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・oracledatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■sql select * from sample1 s1, sample2 s2 where to_char(sysdate -2, 'yyyymmdd') between s1.staymd(+) and s2.(+)
回答: 質問の趣旨がつかみきれていなければごめんなさい。 書かれているクエリの末尾の「and s2.(+)」というのはどう考えてもおかしいので、 ここが「and s2.endymd(+)」とでもなっている前提で書きますと、 (sample1にstaymdというカラムがあることも書かれていませんけど) ・to_char(sysdate-2, 'yyyymmdd')が「今日から2日前のyyyymmdd文字列」であると理解しているならば、 評価しているのは、例えば今日なら「20081222」という文字列です。 between句も結局真であるかどうかを判断することに変わりはないわけですから、 field1 between 1 and 10 という書き方でなくても構わないわけです。 7 between field1 and 10 は、field1が7以下であれば真になります。 ・書き換えたら理解しやすいと思います。 select * from sample1 s1, sample2 s2 where to_char(sysdate-2, 'yyyymmdd') between s1.staymd(+) and s2.endymd(+) => select * from sample1 s1, sample2 s2 where '20081222' between s1.staymd(+) and s2.endymd(+) => select * from sample1 s1, sample2 s2 where '20081222' >=s1.staymd(+) and '20081222'<=s2.endymd(+) => select * from sample1 s1, sample2 s2 where s1.staymd(+)<='20081222' and s2.endymd(+)>='20081222' そうやってみると、外部結合を示す(+)がこの場合何の意味もないことが分かるでしょう。 (外部結合しようにも相手はテーブルではないからです) もともと外部結合というのは片側に対象データがなくても抽出することを目的として使うものですが、もしそういう意図で(+)を書いているのだとしても、片側がnullだとbetweenは常に真にはならないので、意味がありません。 select * from sample1 s1, sample2 s2, (select to_char(sysdate-2, 'yyyymmdd') dt from dual) s3 where s3.dt between nvl(s1.staymd(+),'19000101') and nvl(s2.endymd(+),'20991231') と書くなら、少しは意味があるかもしれませんね。