2011-06-20 15 views
3

次のようにSQL Serverで簡単なプロシージャを作成します。SQLのfromとtoの値の順番

DECLARE @num int; 
SET @num = 5; 
SELECT @num WHERE @num BETWEEN 1 AND 10; 
SELECT @num WHERE @num BETWEEN 10 AND 1; 

これを実行すると、最初のselect文は5を返し、2番目のselect文は何も返しません。 私は、これがなぜであるかについて混乱しています。なぜなら、両方とも5が10と1と1と10の間で真でなければならないからです。

BETWEEN 10 AND 1が論理を無視する理由はありますか?

ありがとうございました

+0

常に低い値で開始し、2番目の値は最初の値よりも高い値にする必要があります。 – Ruben

+1

これは、マニュアルに書いてあるとおりです。 – MatBailie

答えて

6

これはSQLの標準(これが決定したもの)です。 SQL-92 specifications (a copy of a review draft)

8.3 <between predicate> 

    Function 
    Specify a range comparison. 

    Format 
    <between predicate> ::= 
      <row value constructor> [ NOT ] BETWEEN 
      <row value constructor> AND <row value constructor> 

    Syntax Rules 
    1) The three <row value constructor>s shall be of the same degree. 
    2) Let respective values be values with the same ordinal position 
     in the two <row value constructor>s. 
    3) The data types of the respective values of the three <row value 
     constructor>s shall be comparable. 
    4) Let X, Y, and Z be the first, second, and third <row value con- 
     structor>s, respectively. 
    5) "X NOT BETWEEN Y AND Z" is equivalent to "NOT (X BETWEEN Y AND 
     Z)". 
    6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z". 

のみRDBMSは、私はそれが標準から離れている知っている(と、次のとおりです。

(a <= x) AND (x <= b) 

ため

x BETWEEN a AND b 

スタンドは、のページ211を参照してください。あなたのロジック)はMSアクセス。

+0

まあ、それは真実に近いです。 BETWEENは、さまざまなプラットフォームで異なる(包括的/排他的)実装されています。 – MatBailie

+0

@Dems:私はそれを知らなかった。あなたはより多くの情報を提供してください(dbms、どのプラットフォームで、どのような違いがありますか)? –

2

BETWEEN文は、この周りを回す

WHERE @num >= 1 and @num <= 10. 

として翻訳することができるくらいの戻りません

WHERE @num >= 10 and @num <= 1. 

になります。

+1

SQL標準に関する他の答えと併せて、理にかなっていますが、そうでなければBETWEEN関数の不足のように見えます。 – Sivakanesh

+0

あなたはそれを英語で考えるならば。それは実際には一般的なケースの略称です。 –

2

それはそれが設計されている方法です。

WHERE 5<test_expression> BETWEEN 10<begin_expression> AND 1<end_expression>; 

BETWEENマッチの要件を満たしていません。 trueを返しBETWEEN

test_expressionの値がより大きいかbegin_expression の値に等しい 及び以下 END_EXPRESSIONの値に等しい場合。