SQL IN()句の値の順序で結果を並べ替える3つの方法とサンプルコード
SQL IN() 句の値の順序で順序付けする
SQL IN() 句は、指定された値のリストに基づいて行をフィルター処理するために使用されます。しかし、デフォルトでは IN() 句内の値の順序は結果に反映されません。
このチュートリアルでは、MySQL を使用して SQL IN() 句内の値の順序で結果をどのように並べ替えるかについて説明します。
方法
以下の2つの方法があります。
ORDER BY 句
ORDER BY 句を使用して、IN() 句内の値の順序に基づいて結果を直接並べ替えることができます。
SELECT * FROM テーブル名
WHERE 列名 IN ('値1', '値2', '値3')
ORDER BY FIELD(列名, '値1', '値2', '値3');
解説
FIELD()
関数は、指定された列内の値の順序に基づいてインデックス番号を返します。- 上記の例では、
列名
が値1
、値2
、値3
の順に並べ替えられます。
CASE 式
CASE 式を使用して、IN() 句内の値の順序に基づいて新しい列を作成し、その列で結果を並べ替えることができます。
SELECT *,
CASE
WHEN 列名 = '値1' THEN 1
WHEN 列名 = '値2' THEN 2
ELSE 3
END AS 順序
FROM テーブル名
WHERE 列名 IN ('値1', '値2', '値3')
ORDER BY 順序 ASC;
- CASE 式は、
列名
の値に基づいて順序
という新しい列を作成します。 順序
列は、値1
、値2
、値3
の順に 1、2、3 という値が割り当てられます。- ORDER BY 句を使用して、
順序
列に基づいて結果を昇順に並べ替えます。
-- テーブル作成
CREATE TABLE テーブル名 (
id INT,
列名 VARCHAR(255)
);
-- データ挿入
INSERT INTO テーブル名 (id, 列名) VALUES (1, '値3');
INSERT INTO テーブル名 (id, 列名) VALUES (2, '値1');
INSERT INTO テーブル名 (id, 列名) VALUES (3, '値2');
-- クエリ実行
SELECT * FROM テーブル名
WHERE 列名 IN ('値1', '値2', '値3')
ORDER BY FIELD(列名, '値1', '値2', '値3');
結果
id | 列名
------- | --------
2 | 値1
3 | 値2
1 | 値3
-- テーブル作成
CREATE TABLE テーブル名 (
id INT,
列名 VARCHAR(255)
);
-- データ挿入
INSERT INTO テーブル名 (id, 列名) VALUES (1, '値3');
INSERT INTO テーブル名 (id, 列名) VALUES (2, '値1');
INSERT INTO テーブル名 (id, 列名) VALUES (3, '値2');
-- クエリ実行
SELECT *,
CASE
WHEN 列名 = '値1' THEN 1
WHEN 列名 = '値2' THEN 2
ELSE 3
END AS 順序
FROM テーブル名
WHERE 列名 IN ('値1', '値2', '値3')
ORDER BY 順序 ASC;
id | 列名 | 順序
------- | -------- | --------
2 | 値1 | 1
3 | 値2 | 2
1 | 値3 | 3
他の方法
サブクエリ
SELECT * FROM テーブル名
WHERE 列名 IN (
SELECT 列名
FROM テーブル名
ORDER BY 列名 ASC
);
- サブクエリは、
列名
を昇順に並べ替えて、IN() 句で使用されます。
JOIN
SELECT t1.*
FROM テーブル名 t1
JOIN (
SELECT 列名, ROW_NUMBER() OVER (ORDER BY 列名 ASC) AS 順序
FROM テーブル名
) t2 ON t1.列名 = t2.列名
ORDER BY t2.順序 ASC;
- サブクエリは、
列名
を昇順に並べ替えて、順序
という新しい列を作成します。 - JOIN は、
テーブル名
とサブクエリを列名
で結合します。
仮想テーブル
CREATE TEMPORARY TABLE 仮想テーブル名 (
列名 VARCHAR(255)
);
INSERT INTO 仮想テーブル名 (列名) VALUES ('値1');
INSERT INTO 仮想テーブル名 (列名) VALUES ('値2');
INSERT INTO 仮想テーブル名 (列名) VALUES ('値3');
SELECT * FROM テーブル名
WHERE 列名 IN (
SELECT 列名
FROM 仮想テーブル名
ORDER BY 列名 ASC
);
- 仮想テーブルは、
値1
、値2
、値3
の順に作成されます。 - IN() 句は、仮想テーブルを使用して、結果をフィルタリングします。
どの方法を選択するかは、状況によって異なります。
- データ量が少ない場合は、ORDER BY 句を使用するのが最も簡単です。
- データ量が多い場合は、サブクエリや JOIN を使用すると効率的です。
- 複雑な順序付けが必要な場合は、CASE 式を使用する必要があります。
mysql sql sql-order-by