SQL中的大值设计

SQL中的大值设计,sql,mysql,oracle,Sql,Mysql,Oracle,好的,我必须把空值放在最后。查询应该在Oracle和MySQL下运行 我已经想到了 ORDER BY CASE WHEN some_table.ord IS NULL THEN 9999999999 ELSE some_table.ord END 我应该使用value>maxsome_table.ord而不是99999999 我认为确定这个值的子查询在这里太难看了 如果这是C++,我可以使用一些类似于宏的Inthax来实现这个目的。你能说出它的交叉DBMS SQL twin吗 更新

好的,我必须把空值放在最后。查询应该在Oracle和MySQL下运行

我已经想到了

ORDER BY

    CASE WHEN some_table.ord IS NULL THEN 9999999999 ELSE some_table.ord END
我应该使用value>maxsome_table.ord而不是99999999

我认为确定这个值的子查询在这里太难看了

如果这是C++,我可以使用一些类似于宏的Inthax来实现这个目的。你能说出它的交叉DBMS SQL twin吗

更新

问题是我能不能放点东西。。漂亮而不是99999999,这样查询在Oracle和MySQL中都能工作

在甲骨文中不是,它只是

ORDER BY some_table.ord NULLS LAST
在甲骨文中,它只是

ORDER BY some_table.ord NULLS LAST

为空标志使用一个额外的列:

order by 
   case when some_table.ord is null then 2 else 1 end ,
   some_table.ord
或者,如果您对该列可以采用的值有足够的了解,只需硬编码一个大于其中任何值的数字:

order by coalesce(some_table.ord, 9999999999)

为空标志使用一个额外的列:

order by 
   case when some_table.ord is null then 2 else 1 end ,
   some_table.ord
或者,如果您对该列可以采用的值有足够的了解,只需硬编码一个大于其中任何值的数字:

order by coalesce(some_table.ord, 9999999999)

类似以下的方法可能会起作用:

SELECT S.VAL1, S.VAL2, S.VAL3, COALESCE(S.ORD, O.MAX_ORD+1) AS ORD
  FROM SOME_TABLE S,
       (SELECT MAX(ORDER) AS MAX_ORD FROM SOME_TABLE) O
  WHERE S.whatever = whichever AND
        S.something <> something_else
  ORDER BY ORD
不确定MySQL是否允许在FROM列表中进行子查询。这里的想法是避免使用魔法值来处理NULL情况


分享和享受。

以下类似的方法可能会奏效:

SELECT S.VAL1, S.VAL2, S.VAL3, COALESCE(S.ORD, O.MAX_ORD+1) AS ORD
  FROM SOME_TABLE S,
       (SELECT MAX(ORDER) AS MAX_ORD FROM SOME_TABLE) O
  WHERE S.whatever = whichever AND
        S.something <> something_else
  ORDER BY ORD
不确定MySQL是否允许在FROM列表中进行子查询。这里的想法是避免使用魔法值来处理NULL情况


共享和享受。

不幸的是,这在MySQLIs上不可用不幸的是,这在MySQLIs上不可用,它的性能比case语句更好还是更差?出于某种原因,我倾向于案例陈述更好。@Emtucifor-我不想活在案例和合并之间的区别上。这种情况的优点是不需要硬编码的最大值,但它需要更多的输入。@APC-我完全支持少输入,相信我,我对此很恼火,但如果有性能方面的影响,我真的不在乎是否需要多输入一点。@Emtucifor-也许我太狡猾了。这并不影响性能。在引擎盖下,它们都是开关。@APC-可能太微妙了,但肯定是不正确的。我针对一个表测试了这两个表达式,该表有1.43亿行,需要超过320万次读取,而Coalesce版本的CPU占用率始终增加了5%到8%,平均增加了7.24%。以下是我3次处决的原始数字:124780134579;124843,135158; 128750,136062. 考虑到IsNull扩展为CASE语句,并且Coalescedbo.ExpensiveFunction与IsNulldbo.ExpensiveFunction非常不同,请看一下执行计划,这对我来说并不奇怪。coalesce的性能比CASE语句更好还是更差?出于某种原因,我倾向于案例陈述更好。@Emtucifor-我不想活在案例和合并之间的区别上。这种情况的优点是不需要硬编码的最大值,但它需要更多的输入。@APC-我完全支持少输入,相信我,我对此很恼火,但如果有性能方面的影响,我真的不在乎是否需要多输入一点。@Emtucifor-也许我太狡猾了。这并不影响性能。在引擎盖下,它们都是开关。@APC-可能太微妙了,但肯定是不正确的。我针对一个表测试了这两个表达式,该表有1.43亿行,需要超过320万次读取,而Coalesce版本的CPU占用率始终增加了5%到8%,平均增加了7.24%。以下是我3次处决的原始数字:124780134579;124843,135158; 128750,136062. 考虑到IsNull扩展为CASE语句,并且Coalescedbo.ExpensiveFunction与IsNulldbo.ExpensiveFunction非常不同,请看一下执行计划,这对我来说并不奇怪。无需查询max,这会对性能造成影响。只需使用Thilo的技术,就可以了。没有必要去查询最大值,这是一个性能上的打击。就用蒂洛的技术吧。