- ベストアンサー
SQLのBetween句とは?ヒントを教えてください
- SQL初心者です。where句のbetweenの箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか?また、カラム名に(+)をつけた場合は何を意味しているのでしょうか?このSQLについての知識を持っている方、教えてください。
- SQLのBetween句について、初心者の私が分からないポイントがあります。具体的には、where句のbetweenの箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた場合、一体何を評価しているのかが分かりません。また、条件部分のカラム名に(+)をつけるとどうなるのでしょうか?知識のある方、教えていただけますでしょうか。
- SQL初心者の私が質問です。SQLのBetween句で理解できない箇所があります。具体的には、where句のbetweenの箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた場合、何を評価しているのかが分かりません。また、条件部分のカラム名に(+)をつけるとどうなるのでしょうか?詳しい方、教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
質問の趣旨がつかみきれていなければごめんなさい。 書かれているクエリの末尾の「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') と書くなら、少しは意味があるかもしれませんね。
お礼
こんなに詳しくありがとうございました、理解しました。 私の間違いまで指摘してもらい本当に助かりました。