我想在order by子句之后使用子选择查询动态排序数据集。为了让自己熟悉这一点,我创建了一个小测试集并尝试了各种不起作用的东西。
要直接查看结果,我尝试通过按不存在的列排序来产生错误。这是我的查询和结果:
select * from entries order by 2 desc, (select case when (1=1) then 4 else 5 end);
select * from entries order by 2 desc, (select if(1=1,4,5));
+----+------+---------+------+
| id | name | content | time |
+----+------+---------+------+
| 19 | ccc | ccc | 300 |
| 18 | bbb | bbb | 200 |
| 17 | aaa | aaa | 100 |
| 20 | aaa | aaa | 400 |
| 21 | aaa | aaa | 50 |
+----+------+---------+------+
从1 = 1切换到1 = 2不会以任何方式改变结果。我预计错误1 = 2但没有发生任何事情。即使在这种形式下,两个查询都应该排在第4列,但他们不这样做。
我希望数据集按第四列排序,所以它看起来像这样:
+----+------+---------+------+
| id | name | content | time |
+----+------+---------+------+
| 19 | ccc | ccc | 300 |
| 18 | bbb | bbb | 200 |
| 21 | aaa | aaa | 50 |
| 17 | aaa | aaa | 100 |
| 20 | aaa | aaa | 400 |
+----+------+---------+------+
答案 0 :(得分:1)
你真的不应该使用order by
的位置语法 - 我甚至认为它在ANSI标准中已被弃用。整数 - 本身 - 表示按位置的列。但是,在带有数字的表达式中,值只是数字。
因此,请明确包含列名称:
order by name desc,
(case when (1=1) then time else ?? end)
没有理由在select
之前设置case
。