是否可以在单个查询中使用order by和where

时间:2009-07-17 07:45:40

标签: sql mysql caching

我创建了一个表。在一个字段中,我具有该记录的优先级(1-9之间)。 我没有为所有记录设置优先级,因此对于某些记录,它将保持为空。

在我的HTML页面中显示这些记录时,我只检查这些优先级 - 如果优先级存在,那么我将显示原样,如果它为空,那么我将它显示为'10'的最低优先级(只是为了展示)。

排序表时出现问题。如果我尝试sort(DESC)表格,它会在第一行显示10,然后继续完美(1,2,....)。

如何解决这个问题?

是否可以先显示优先级,然后继续显示空值?

3 个答案:

答案 0 :(得分:4)

这是一个简短的示例,展示了如何将NULL转换为值然后对其进行排序。

create table test
(
    priority int null,
    detail varchar(10)
)

insert into test values (1, 'one')
insert into test values (3, 'three')
insert into test values (8, 'eight')
insert into test values (9, 'nine')
insert into test values (null, 'ten')

select ISNULL(priority, 10), detail from test order by ISNULL(priority, 10)

关键是ISNULL的null'able值字段将NULL转换为你想要的值(10)。

答案 1 :(得分:2)

有很多方法可以解决它。

1 /更改数据,使10实际上在表中(而不是NULL):

update table TBL set FLD = 10 where FLD is null;

2 /修改您的查询以返回NULL的不同值:

select FLD1, FLD2, case where FLD3 is null then 10 else FLD3 end from ...

3 /创建一个视图以自动执行选项2。

我倾向于选择1,因为它可能是最有效的。

SQL没有指定NULL的排序方式(尽管我认为它们必须相邻) - 这意味着它们可能位于开头或结尾(或者可能位于中间但我从未见过这种情况)。 / p>

我提出效率方面的原因是每行功能不能很好地扩展。随着表格越来越大,您会发现每次选择时将NULL转换为10将非常昂贵。

咬住子弹并在数据库中将它们设置为10要好得多。这将允许DBMS更好地优化查询。而且,如果你需要使用10作为另一个真正的优先级,只需在开始之前将所有当前的10s更改为11s(或9999s)。

答案 2 :(得分:1)

如果您希望最后出现具有NULL优先级的记录,我建议使用

之类的内容

ORDER BY(IFNULL(优先级,1000000))或类似的东西