在order by子句中使用布尔表达式

8

我有一个类似于以下的order by子句:

( user_id <> ? ), rating DESC, title

将“?”替换为当前用户的id。

在postgresql上,这给我想要的排序,即按当前用户、最高评分、标题(按字母顺序)排序。

然而,在MySQL上,我的排序不清晰,当前用户既不是第一个也不是最后一个,评分和标题也不是。

是否我的跨数据库兼容性唯一选择是用CASE WHEN .. THEN .. ELSE .. END语句替换这个快速且不准确的布尔表达式?

编辑:感谢大家的帮助,正如Chaos和Chad Birch所指出的那样,问题实际上出现在其他地方(具体来说,我将上述查询结果用作下一个输入——然后惊讶地发现第一个的顺序丢失了;)


这应该能正常工作,我会寻找其他可能导致它出错的问题。如果想确认它输出正确的值(对于当前用户应为0,否则为1),可以将"(user_id <> ?)"添加到SELECT子句中。 - Chad Birch
3个回答

12

MySQL在布尔类型上没有真正的概念,它简单地将TRUEFALSE映射为数字值10

在这种情况下,user_id <> ?将对表中大多数行返回0,并对其他行返回1。默认排序顺序是ASC,这意味着你想要的行很可能在结果集的底部(0/FALSE1/TRUE之前)。尝试修改查询以适应此情况。

( user_id <> ? ) DESC, rating DESC, title

如果这确实是问题所在,那么跨数据库的兼容性可以轻松实现。

IF(user = ?, 0, 1), rating DESC, title

我应该指出,我不熟悉PostgreSQL的特定SQL语言。我假设存在一个简单的IF()函数,就像MySQL一样,但如果不存在,我很抱歉,并将留下适当的更正作为读者的练习 :) - Alex Barrett
它并不存在,但是像你第一个例子中那样简单地使用(boolean expression) DESC就可以了。 - JacobEvelyn

3
你可以尝试执行一个操作。
select (user_id <> ?), user_id

要确保正确显示 true/false 值,请查看。


1

我在MySQL上测试了几个变量,它们都正确运行(就像您期望的那样)。我想你的问题肯定不在查询语句上。为了验证,请尝试直接从MySQL客户端运行一个等效的查询语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接