Sql 带有ORDER BY with CASE子句的随机排序
我正在用CASE测试ORDER BY子句,遇到了这个问题 我的测试选择语句: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
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专家就可以回答)。