Sqlite3订单不适合工会

时间:2014-06-03 16:14:18

标签: sqlite

我有这个简化的例子:

CREATE TABLE test1 ( 
    id                     INTEGER        NOT NULL
                                          PRIMARY KEY AUTOINCREMENT,
    status                 TEXT           NOT NULL
                                          DEFAULT 'waiting');
CREATE TABLE test2 ( 
    id                     INTEGER        NOT NULL
                                          PRIMARY KEY AUTOINCREMENT,
    status                 TEXT           NOT NULL
                                          DEFAULT 'waiting');

我运行此查询:

SELECT status
FROM test1

UNION

SELECT status
FROM test2

ORDER BY CASE status
WHEN 'accepted' THEN 1
WHEN 'invited' THEN 2
WHEN 'waiting' THEN 3
WHEN 'cancelled' THEN 4
ELSE 5
END

希望根据该领域的文本内容获得1-5的组合排序。

然而,我收到此错误:

Error while executing query: 1st ORDER BY term does not match any column in the result set

当我删除UNION的任何一部分时,查询工作正常,因此它与"情况无关"构造

据我所知,两个工会部分都有相同的栏目名称' status',所以我不明白为什么我不能订购工会。

它在mysql中工作,但是如果可能的话,我想让它在sqlite中工作......

1 个答案:

答案 0 :(得分:2)

documentation说:

  

如果SELECT是复合SELECT,则不是输出列别名的ORDER BY表达式必须与用作输出列的表达式完全相同。

所以你必须使排序表达式成为输出列:

SELECT status,
       CASE ... END AS order_me
FROM test1
UNION ALL
SELECT status,
       CASE ... END
FROM test2
ORDER BY order_me

为避免重复,您可以使用子查询:

SELECT status
FROM (SELECT status
      FROM test1
      UNION ALL
      SELECT status
      FROM test2)
ORDER BY CASE status ...
         END