我有一个表,其列为id、name和威胁&希望对威胁列使用order子句。
威胁1是最高优先级,5是最低优先级。很少有记录不会有威胁得分和零得分。
因此,在屏幕上显示它时,用数值6减去威胁分数(如果威胁有值),同样也将用作威胁分数。
在按asc对列威胁进行排序时,它首先选择空值(无威胁),然后按desc排序,其第一个值为5(最低威胁)。
因此,屏幕上的最终订单是ASC (减去6)。如果您在这里看到,威胁评分与5显示为顶部,因为SQL发送记录按威胁得分排序。
+-------------+------------+
| screen data | Table data |
+-------------+------------+
| NULL | Null |
| 1 | 5 |
| 2 | 4 |
| 3 | 3 |
| 4 | 2 |
| 0 | 0 |
+-------------+------------+已经尝试过ORDER BY threat * -1 ASC,但是它给出了错误
超出范围的BigInt未签名错误
在这里,我的要求是在排序记录时获得1作为最高记录的威胁得分,因为NULL是有先例的。
排序的预期行为(ASC或desc)
+--------+
| Threat |
+--------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 0 |
| NULL |
+--------+-工作方案
在这里令人敬畏的人的帮助下,下面的解决方案就像魅力一样有效。
ORDER BY IF (threat=0,6, ifnull(threat,6)) ASC ; 发布于 2019-06-11 05:28:40
在这种情况下,您必须处理NULL值。处理NULL值的方法不多。您可以将默认值更改为适合您使用的值,在这种情况下,NULL值将消失,您的问题将得到解决。另一种解决方案是拥有NULL值,但在查询表时处理它们。您可以使用IFNULL(expression, alt_value),在您的情况下,它将是:
IFNULL(threat, 6)如果模式是:
CREATE TABLE IF NOT EXISTS `threat_table` (
`id` int(3) unsigned ,
`name` varchar(200),
`threat` int(3) unsigned
) DEFAULT CHARSET=utf8;
INSERT INTO `threat_table` (`id`, `name`, `threat`) VALUES
('1', 'test1', '5'),
('2', 'test2', NULL),
('3', 'test3', '4'),
('4', 'test4', '3'),
('5', 'test5', '2'),
('6', 'test6', '1');您的查询是:
SELECT * from table order by IFNULL(threat, 6)结果令人满意:
+----+-------+--------+
| id | name | threat |
+----+-------+--------+
| 6 | test6 | 1 |
| 5 | test5 | 2 |
| 4 | test4 | 3 |
| 3 | test3 | 4 |
| 1 | test1 | 5 |
| 2 | test2 | (null) |
+----+-------+--------+看看这把小提琴。
更新:
如果威胁号可以是大于1.5的任何值,我们可以使用以下查询:
select * from threat_table order by IFNULL(threat, ~0 >> 33)发布于 2019-06-11 05:10:01
请使用ifnull()函数。在选择查询中用适当的值替换null值。
发布于 2019-06-11 05:38:41
SELECT *
FROM TableName
ORDER BY (CASE
WHEN ColumnName IS NULL THEN 1
ELSE 0
END),
ColumnName我希望这能行。
https://stackoverflow.com/questions/56536792
复制相似问题