使用 SQLite WHERE 子句和 IN 运算符时维护顺序
Maintain order when using SQLite WHERE-clause and IN operator
考虑以下 tbl
:
CREATE TABLE tbl (ID INTEGER, ticker TEXT, desc TEXT);
INSERT INTO tbl (ID, ticker, desc)
VALUES (1, 'GDBR30', '30YR'),
(2, 'GDBR10', '10YR'),
(3, 'GDBR5', '5YR'),
(4, 'GDBR2', '2YR');
作为参考,tbl
看起来像这样:
ID ticker desc
1 GDBR30 30YR
2 GDBR10 10YR
3 GDBR5 5YR
4 GDBR2 2YR
当发出以下语句时,结果将按照ID
.
排序
SELECT * FROM tbl
WHERE ticker in ('GDBR10', 'GDBR5', 'GDBR30')
ID ticker desc
1 GDBR30 30YR
2 GDBR10 10YR
3 GDBR5 5YR
但是,我需要按照传递的值列表的顺序进行排序。这是我要找的东西:
ID ticker desc
2 GDBR10 10YR
3 GDBR5 5YR
1 GDBR30 30YR
确定记录最终排序的唯一方法是使用 ORDER BY
子句。
给定值列表的顺序与最终顺序无关。
在您的情况下,您唯一的解决方案是为每个值赋予一个 'weight' 以用作排序顺序。
例如,您可以使用 INSTR
函数更改 IN
运算符,以获得可过滤和可排序的结果。
尝试类似的东西
SELECT *, INSTR(',GDBR10,GDBR5,GDBR30,', ',' || ticker || ',') POS
FROM tbl
WHERE POS>0
ORDER BY POS;
如果您不想要所选字段列表中的位置,您可以使用子查询:
SELECT *
FROM (SELECT *, INSTR(',GDBR10,GDBR5,GDBR30,', ',' || ticker || ',') pos FROM tbl) X
WHERE POS>0
ORDER BY POS;
您可以创建一个 CTE
returns 2 列:您搜索的值以及每个值的排序顺序并将其加入 table.
在 ORDER BY
子句中使用排序顺序列对结果进行排序:
WITH cte(id, ticker) AS (VALUES (1, 'GDBR10'), (2, 'GDBR5'), (3, 'GDBR30'))
SELECT t.*
FROM tbl t INNER JOIN cte c
ON c.ticker = t.ticker
ORDER BY c.id
参见demo。
考虑以下 tbl
:
CREATE TABLE tbl (ID INTEGER, ticker TEXT, desc TEXT);
INSERT INTO tbl (ID, ticker, desc)
VALUES (1, 'GDBR30', '30YR'),
(2, 'GDBR10', '10YR'),
(3, 'GDBR5', '5YR'),
(4, 'GDBR2', '2YR');
作为参考,tbl
看起来像这样:
ID ticker desc
1 GDBR30 30YR
2 GDBR10 10YR
3 GDBR5 5YR
4 GDBR2 2YR
当发出以下语句时,结果将按照ID
.
SELECT * FROM tbl
WHERE ticker in ('GDBR10', 'GDBR5', 'GDBR30')
ID ticker desc
1 GDBR30 30YR
2 GDBR10 10YR
3 GDBR5 5YR
但是,我需要按照传递的值列表的顺序进行排序。这是我要找的东西:
ID ticker desc
2 GDBR10 10YR
3 GDBR5 5YR
1 GDBR30 30YR
确定记录最终排序的唯一方法是使用 ORDER BY
子句。
给定值列表的顺序与最终顺序无关。
在您的情况下,您唯一的解决方案是为每个值赋予一个 'weight' 以用作排序顺序。
例如,您可以使用 INSTR
函数更改 IN
运算符,以获得可过滤和可排序的结果。
尝试类似的东西
SELECT *, INSTR(',GDBR10,GDBR5,GDBR30,', ',' || ticker || ',') POS
FROM tbl
WHERE POS>0
ORDER BY POS;
如果您不想要所选字段列表中的位置,您可以使用子查询:
SELECT *
FROM (SELECT *, INSTR(',GDBR10,GDBR5,GDBR30,', ',' || ticker || ',') pos FROM tbl) X
WHERE POS>0
ORDER BY POS;
您可以创建一个 CTE
returns 2 列:您搜索的值以及每个值的排序顺序并将其加入 table.
在 ORDER BY
子句中使用排序顺序列对结果进行排序:
WITH cte(id, ticker) AS (VALUES (1, 'GDBR10'), (2, 'GDBR5'), (3, 'GDBR30'))
SELECT t.*
FROM tbl t INNER JOIN cte c
ON c.ticker = t.ticker
ORDER BY c.id
参见demo。