Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带有ORDER BY with CASE子句的随机排序_Sql_Oracle_Case - Fatal编程技术网

Sql 带有ORDER BY with CASE子句的随机排序

Sql 带有ORDER BY with CASE子句的随机排序,sql,oracle,case,Sql,Oracle,Case,我正在用CASE测试ORDER BY子句,遇到了这个问题 我的测试选择语句: SELECT to_date as "One", field1 as "Two" FROM( SELECT to_date('yyyy-mm-dd', '2017-10-10'), '333' union all SELECT to_date('yyyy-mm-dd', '2017-09-09'), '111' union all SELECT to_date('y

我正在用CASE测试ORDER BY子句,遇到了这个问题

我的测试选择语句:

SELECT to_date as "One", field1 as "Two"
   FROM(
        SELECT to_date('yyyy-mm-dd', '2017-10-10'), '333' union all
        SELECT to_date('yyyy-mm-dd', '2017-09-09'), '111' union all
        SELECT to_date('yyyy-mm-dd', '2017-09-09'), '222' union all
        SELECT to_date('yyyy-mm-dd', '2017-09-09'), '' union all
        SELECT to_date('yyyy-mm-dd', '2017-09-09'), ''
        )
   ORDER BY One DESC,
          CASE when Two = '' then 1 
               else 0 end DESC 
其结果可能在某种程度上有所不同,按第二列排序是随机的:


如何修改CASE子句以避免它?

添加列
two
作为三阶条件

ORDER BY One DESC,
         CASE when Two = '' then 1 else 0 end DESC,
         Two DESC

二阶条件只将空条目放在第一位,而不是更多。

添加列
two
作为三阶条件

ORDER BY One DESC,
         CASE when Two = '' then 1 else 0 end DESC,
         Two DESC
二阶条件只将空条目放在第一位,而不是更多。

在Oracle中,查询是:

ORDER BY
  One DESC,
  CASE when Two = NULL then 1 else 0 end DESC
比较值时,可能的状态为:

Equality                 Result
------------------------ ------
value = value            TRUE
value = other_value      FALSE
value = NULL             NULL
NULL  = NULL             NULL
当等式的计算结果为
TRUE
时,您的
大小写
表达式的计算结果将仅为
1
,当等式的至少一侧为
NULL
时,这将永远不会成为结果

您想要使用的是
为NULL,而不是
='

您可以将其简化为:

ORDER BY
  One DESC,
  Two DESC NULLS FIRST;
DESC
排序的默认值为
NULLS FIRST
,因此可以进一步简化为:

ORDER BY
  One DESC,
  Two DESC;
但是,我不会这么说,因为您最好明确表示希望在非
NULL
之前对
NULL
值进行排序,以便未来的开发人员知道这是您的预期排序(而不仅仅是查询的无意副作用)。

在Oracle中,您的查询是:

ORDER BY
  One DESC,
  CASE when Two = NULL then 1 else 0 end DESC
比较值时,可能的状态为:

Equality                 Result
------------------------ ------
value = value            TRUE
value = other_value      FALSE
value = NULL             NULL
NULL  = NULL             NULL
当等式的计算结果为
TRUE
时,您的
大小写
表达式的计算结果将仅为
1
,当等式的至少一侧为
NULL
时,这将永远不会成为结果

您想要使用的是
为NULL,而不是
='

您可以将其简化为:

ORDER BY
  One DESC,
  Two DESC NULLS FIRST;
DESC
排序的默认值为
NULLS FIRST
,因此可以进一步简化为:

ORDER BY
  One DESC,
  Two DESC;

然而,我不会这么说,因为你最好明确地说,你期望
NULL
值在非
NULL
之前排序,这样未来的开发人员就会知道这是你想要的排序(而不仅仅是你的查询无意中产生的副作用)。

@Yogeshharmadone@YogeshSharma我的错, sorry@YogeshSharma done@YogeshSharma我的错,对不起谢谢你,它起作用了!因此,“else 0”部分的意思是忽略任何其他值。
大小写产生两个值:0或1。你可以这样说。这意味着1-值首先出现在列表中,然后是所有的0-值。@Michaelboryashov这里的
CASE
表达式将始终计算为
0
,因此这个
ORDER BY
子句相当于
ORDER BY一个DESC,两个DESC
和(
CASE
表达式无效).对这一原理的解释是完全错误的!谢谢你,这很有效!因此,“else 0”部分的意思是忽略任何其他值。
大小写产生两个值:0或1。你可以这样说。这意味着1-值首先出现在列表中,然后是所有的0-值。@Michaelboryashov这里的
CASE
表达式将始终计算为
0
,因此这个
ORDER BY
子句相当于
ORDER BY一个DESC,两个DESC
和(
CASE
表达式无效).对这一原理的解释是完全错误的!谢谢你的澄清。你知道这是否也适用于denodo的VQL吗?@Michaelboryashov不知道,因为我从来没有使用过denodo-如果你需要答案,那么你可以看看是否可以在他们的文档中找到它,或者用适当的标签作为一个新问题提问(这样denodo专家可以回答)。谢谢你的澄清。你知道这是否也适用于denodo的VQL吗?@Michaelboryashov不知道,因为我从未使用过denodo-如果你需要答案,那么你可以在他们的文档中找到它,或者用适当的标签作为新问题提问(这样denodo专家就可以回答)。