我希望基于从另一个表顺序ASC或DESC查询的值。
这样的事情:
SELECT *
FROM table
ORDER BY
CASE (SELECT sorting from table2 WHERE table2.id = ?)
WHEN 1 THEN table.date ASC END
WHEN 0 THEN table.date DESC END
END
MySQL中有类似内容吗?
我见过MS-SQL Server的一些解决方案:how to order 2 SQL Fields in asc and desc dynamically
编辑:我刚刚看到我在说明中弄错了,修复了。
答案 0 :(得分:3)
order by if((select sorting from table2 where table2.id = ?) = 1,
unix_timestamp(table.date), -unix_timestamp(table.date))
如果您的列是数字,则否定有效。如果它是一个字符串,您可能能够找到另一个函数来将高值映射到低值......
答案 1 :(得分:2)
无法以您的建议方式有条件地构建T-SQL语句。
您需要将查询构建到varchar中,然后对构造的字符串执行EXEC,顺序如下:
Declare @QueryString varchar(100)
Declare @Direction int
Select @direction = sorting
from table2
where table2.id=? //from your original, not clear how you are providing it
Set @QueryString = 'Select * from table order by yourField ' + case when @direction=1 then 'ASC' else 'DESC' end
Exec (@QueryString)
编辑假设您的order_by字段是数字,您使用的一个技巧(虽然我不确定它会落入“最佳实践”阵营)会将订单的价值乘以字段乘以-1以反转默认顺序,例如
Select @Direction = sorting
from table2
where table2.id=?
Select *
from table
order by (case when @direction=1 then -1 else 1 end) *yourField