当前位置: 首页 > 知识库问答 >
问题:

基于空值获得排序SQL查询的最佳方法是什么

公良扬
2023-03-14
CREATE TABLE `test` (
  `field1` int(11) NOT NULL,
  `field2` int(11) DEFAULT NULL,
  `field3` int(11) DEFAULT NULL,
  UNIQUE KEY `field1_2` (`field1`,`field2`),
  UNIQUE KEY `field1_3` (`field1`,`field3`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    null
  • field2和field3为空的所有字段
  • 所有field2为空、field3为值的字段
  • 所有field3为空、field2为值的字段

到目前为止,我已经使用了三个与UNION连接的查询

SELECT * FROM test WHERE field2 IS NULL 
    AND field3 IS NULL UNION
SELECT * FROM test WHERE field2 IS NULL 
    AND field3 IS NOT NULL UNION 
SELECT * FROM test WHERE field2 IS NOT NULL 
    AND field3 IS NULL;

我自己觉得这是很多必要的代码来得到它的秩序,并希望有一个更好的解决方案。

那么有没有更好的办法呢?

共有1个答案

赵俊远
2023-03-14

只需将条件按顺序:

order by (field2 is null and field3 is null) desc,
         (field2 is null and field3 is not null) desc,
         (field2 is null and field3 is not null) desc

您可能需要添加,其中:

where field2 is null or field3 is null

这是因为MySQL将布尔值视为数字上下文中的数字,“true”为1,“false”为0。这就是为什么需要desc。在标准SQL中,您可以将相同的内容表示为:

order by (case when field2 is null and field3 is null then 1
               when field2 is null and field3 is not null then 2
               when field2 is not null and field3 is null then 3
               else 4
          end)
 类似资料:
  • 很抱歉打扰你,但我无法找到一个有效的解决我的问题的方法。我想做一个MongoDB查询,让我得到与SQL查询相同的结果:

  • 我正在使用java servlet编写一个简单的服务器。为了从数据库中获取数据,我编写了一个特殊的Dao层类,我想知道我应该在哪里存储SQL查询? 我需要创建一个特殊的类,将查询存储为最终字符串,还是有更有效的方法来实现?

  • 问题内容: 我试图通过C#中的代码找到最佳的(快速与最简单)访问SQL Server代码的方法。 当我从书本上学习时,我遇到了很多建议,通常都建议我通过拖放来完成。但是,由于我想在代码中做到这一点,所以第一种方法是按列号获取数据,但是SQL Query中的任何重新排序(如添加/删除列)都让我难以解决。 例如(别笑,有些代码大约有2年历史了),我什至编写了特殊的函数来传递sqlQueryResult

  • 问题内容: 在SQL查询中将int或null转换为布尔值的最佳方法是什么,例如: 任何非空值为 TRUE 的结果 任何空值是 假 的结果 问题答案: 据我所知(如果我错了,请纠正我),SQL中没有文字布尔值的概念。您可以使表达式的计算结果为布尔值,但不能输出它们。 就是说,您可以使用CASE WHEN来产生可以在比较中使用的值:

  • 问题内容: 在调用对象的函数之前,我需要检查对象是否为null,以避免引发。 最好的方法是什么?我考虑过这些方法。 哪一种是Java最佳编程实践? 问题答案: 方法4是最好的。 将使用短路评估,这意味着如果a的第一个条件为假,则评估结束。

  • 尝试使用CompletionSuggester for autocomplete特性,通过Java的RestHighLevelClient实现CompletionSuggester有不同的方法,想知道以下这些方法之间(在性能/查询执行速度方面)有什么区别吗 1:使用CompletionSuggestionBuilder: 2:使用SimpleQueryString