使用 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