SQL Server で範囲条件を記述する方法:BETWEEN 演算子 vs その他の方法
MS SQL Server の BETWEEN 演算子:範囲境界を含むか?
概要
疑問:範囲境界は含まれるか?
BETWEEN 演算子を使用する際に、境界値自身が範囲に含まれるかどうかは、多くの開発者にとって疑問となります。
答え:境界値は含まれる
MS SQL Server の BETWEEN 演算子は、デフォルトで境界値を含みます。 つまり、比較対象となる値が境界値と等しい場合も、BETWEEN 演算子は True を返します。
例
以下の例は、BETWEEN 演算子の動作を説明します。
-- 境界値を含む
SELECT * FROM Customers WHERE Age BETWEEN 18 AND 35;
-- 境界値を含む
SELECT * FROM Products WHERE Price BETWEEN 100 AND 200;
-- 境界値を含まない
SELECT * FROM Orders WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';
上記の例では、最初の 2 つのクエリは境界値を含むため、すべてのレコードが返されます。一方、3 番目のクエリは境界値を含まないため、2023 年 1 月 1 日と 2023 年 12 月 31 日を含むレコードのみが返されます。
境界値を含まないようにするには
BETWEEN 演算子で境界値を含まないようにするには、NOT BETWEEN 演算子を使用します。
-- 境界値を含まない
SELECT * FROM Customers WHERE Age NOT BETWEEN 18 AND 35;
-- 境界値を含まない
SELECT * FROM Products WHERE Price NOT BETWEEN 100 AND 200;
上記の例では、境界値を含まないため、18 歳未満または 35 歳以上の顧客、100 ドル未満または 200 ドル以上の製品のみが返されます。
- MS SQL Server の BETWEEN 演算子は、デフォルトで境界値を含みます。
補足
- BETWEEN 演算子は、数値だけでなく、日付や文字列にも使用できます。
- BETWEEN 演算子は、複合条件の一部として使用できます。
境界値を含む
-- 18歳から35歳までの顧客を取得
SELECT *
FROM Customers
WHERE Age BETWEEN 18 AND 35;
-- 100ドルから200ドルまでの商品を取得
SELECT *
FROM Products
WHERE Price BETWEEN 100 AND 200;
-- 2023年1月1日から2023年12月31日までの注文を取得
SELECT *
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';
境界値を含まない
-- 18歳未満または35歳以上の顧客を取得
SELECT *
FROM Customers
WHERE Age NOT BETWEEN 18 AND 35;
-- 100ドル未満または200ドル以上の商品を取得
SELECT *
FROM Products
WHERE Price NOT BETWEEN 100 AND 200;
-- 2023年1月1日と2023年12月31日を除く注文を取得
SELECT *
FROM Orders
WHERE OrderDate NOT BETWEEN '2023-01-01' AND '2023-12-31';
複合条件
-- 18歳から35歳までの顧客で、かつ男性の顧客を取得
SELECT *
FROM Customers
WHERE Age BETWEEN 18 AND 35
AND Gender = 'Male';
-- 100ドルから200ドルまでの商品で、かつ在庫数が5個以上の商品を取得
SELECT *
FROM Products
WHERE Price BETWEEN 100 AND 200
AND QuantityInStock >= 5;
-- 2023年1月1日から2023年12月31日までの注文で、かつ注文金額が1万円以上の注文を取得
SELECT *
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31'
AND OrderTotal >= 10000;
- BETWEEN 演算子は、LIKE 演算子と組み合わせて使用することもできます。
BETWEEN 演算子の代替方法
CASE 式を使用して、範囲条件を記述することができます。
-- 18歳から35歳までの顧客を取得
SELECT *
FROM Customers
WHERE CASE Age
WHEN BETWEEN 18 AND 35 THEN 1
ELSE 0
END = 1;
-- 100ドルから200ドルまでの商品を取得
SELECT *
FROM Products
WHERE CASE Price
WHEN BETWEEN 100 AND 200 THEN 1
ELSE 0
END = 1;
-- 2023年1月1日から2023年12月31日までの注文を取得
SELECT *
FROM Orders
WHERE CASE OrderDate
WHEN BETWEEN '2023-01-01' AND '2023-12-31' THEN 1
ELSE 0
END = 1;
IN 演算子を使用して、範囲内の値のリストを指定することができます。
-- 18歳、25歳、35歳の顧客を取得
SELECT *
FROM Customers
WHERE Age IN (18, 25, 35);
-- 100ドル、150ドル、200ドルの商品を取得
SELECT *
FROM Products
WHERE Price IN (100, 150, 200);
-- 2023年1月1日、2023年7月1日、2023年12月31日までの注文を取得
SELECT *
FROM Orders
WHERE OrderDate IN ('2023-01-01', '2023-07-01', '2023-12-31');
-- 18歳から35歳までの顧客を取得
SELECT *
FROM Customers
WHERE Age >= 18 AND Age <= 35;
-- 100ドルから200ドルまでの商品を取得
SELECT *
FROM Products
WHERE Price >= 100 AND Price <= 200;
-- 2023年1月1日から2023年12月31日までの注文を取得
SELECT *
FROM Orders
WHERE OrderDate >= '2023-01-01' AND OrderDate <= '2023-12-31';
- BETWEEN 演算子は、範囲条件を記述する最も簡潔な方法です。
- IN 演算子は、範囲内の値のリストがわかっている場合に便利です。
- 論理演算子は、他の方法よりも柔軟性がありますが、記述が冗長になる場合があります。
BETWEEN 演算子には、CASE 式、IN 演算子、論理演算子など、いくつかの代替方法があります。どの方法を使用するかは、状況によって異なります。
sql sql-server between