简体   繁体   中英

Temporary assigning NULL to a value for the purpose of sorting values in mysql

I am trying to get the correct formatting of results back from a Mysql query. When I ignore the NULL values, the formatting is correct, but when I allow null values to be included, my results are messed up.

I have the following query I am using:

select name,suite,webpagetest.id,MIN(priority) AS min_pri 
FROM webpagetest,comparefileerrors 
WHERE vco="aof" AND user="1" AND calibreversion="9" 
AND webpagetest.id=comparefileerrors.id 
AND comparefileerrors.priority IS NOT NULL 
GROUP BY id 
ORDER BY coalesce(priority,suite,name) ASC;

This returns the expected output:

    +-----------------------------+-----------------------------+-------+---------+
| name                        | suite                       | id    | min_pri |
+-----------------------------+-----------------------------+-------+---------+
| set_get_status              | shortsRepairDB_2009.1_suite |  6193 |       0 | 
| u2uDemo                     | shortsRepairDB_2009.1_suite |  6195 |       0 | 
| change_sets                 | shortsRepairDB_2009.1_suite |  6194 |       0 | 
| bz1508_SEGV_password        | NULL                        |  6185 |       1 | 
| assign_short_AND_user_info  | shortsRepairDB_2009.1_suite |  6198 |       2 | 
| bz1273_cmdline_execplussvdb | NULL                        |  6203 |       2 | 
| bz1747_bad_lvsf             | NULL                        | 36683 |       3 | 
+-----------------------------+-----------------------------+-------+---------+

However, sometimes the priority values will not be set. If this is the case, I want the database to treat the priority as if it had an extremely high priority, so that the values with a null-priority are at the very bottom. I can not set the priority ahead of time (using a default value), but for the purposes of the sort, is it possible to do this?

Currently, if I issue the following command,

select name,suite,webpagetest.id,MIN(priority) AS min_pri 
FROM webpagetest,comparefileerrors 
WHERE vco="aof" AND user="1" AND calibreversion="9" 
AND webpagetest.id=comparefileerrors.id 
GROUP BY id 
ORDER BY coalesce(priority,suite,name) ASC;

I get output like the following:

| name                        | suite | id    | min_pri |
+-----------------------------+-------+-------+---------+
| bz1747_bad_lvsf             | NULL  | 36683 |       1 | 
| NEC_Dragon.query            | NULL  | 36684 |    NULL | 
| avago_hwk_elam0_asic        | NULL  |  6204 |    NULL | 
| bz1273_cmdline_execplussvdb | NULL  |  6203 |       2 | 
| bz1491_query_server_crash   | NULL  |  6188 |    NULL | 
| bz1493_export_built_in_prop | NULL  |  6186 |    NULL | 
+-----------------------------+-------+-------+---------+
6 rows in set (0.68 sec)

Here I have lost the formatting I had before. I would like the formatting to be as follows:

| name                        | suite | id    | min_pri |
+-----------------------------+-------+-------+---------+
| bz1747_bad_lvsf             | NULL  | 36683 |       0 | 
| NEC_Dragon.query            | NULL  | 36684 |       0 |
| avago_hwk_elam0_asic        | NULL  |  6204 |       1 | 
| bz1273_cmdline_execplussvdb | NULL  |  6203 |       2 | 
| bz1491_query_server_crash   | NULL  |  6188 |    NULL | 
| bz1493_export_built_in_prop | NULL  |  6186 |    NULL | 
+-----------------------------+-------+-------+---------+
6 rows in set (0.68 sec)

Hopefully I've explained this well enough that someone can understand what I want here.

Thanks for looking!

if you don't want to use sentinel value, ie ORDER BY COALESCE(priority, 99999); use:

select * from x 
order by 

    case 
    when priority is not null then 1 /* non-nulls, first */ 
    else 2 /* nulls last */ 
    end, 

    priority

or you can take advantage of the fact that mysql boolean expression results to either 1 or 0:

select * from x 
order by priority is null, priority

or if you're using postgresql:

select * from x order by priority nulls first    

alternatively:

select * from x order by priority nulls last

Sounds like you want MIN(IFNULL(priority, 99999)) . See the documentation for the IFNULL() function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM