我有这个简化的例子:
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中工作......
答案 0 :(得分:2)
如果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