如何执行SQL ORDER BY曝光,焦点和iso(数字不是字符串)

时间:2011-09-30 01:22:43

标签: sql sorting floating-point sql-order-by numeric

Exposure,Focal和Iso的列未正确排序。似乎它们都被解释为字符串并按此排序。例如,如果我将Exposure排序,则值可能如下所示:

1 / 800,1 / 800,1 / 800,1 / 80,1 / 675,1 / 640,1 / 60,1 / 500

如果我对Focal进行排序,它可能看起来像这样:

1.4,1.4,1.4,14.0,14.0,1.3,13.0,1.2,1.2,12.0,1.0,10.0

如果我按ISO排序,它可能如下所示:

800,800,800,80,80,640,640,60,500,500,50

编辑:My other question(和答案)在一个单独的SQL查询中完成所有这些操作。

1 个答案:

答案 0 :(得分:2)

我在Oracle上测试了这个

with 
   w_data AS(
      select '1/800' exposure from dual union all
      select '1/80'  from dual union all
      select '1/675' from dual union all
      select '1/640' from dual union all
      select '1/500' from dual 
   )
select *
  from w_data
 order by 1 / to_number(substr(exposure, 3, length(exposure)))   

对于焦点,您执行ORDER BY to_number(focal),对ISO也是如此。

请注意,曝光示例仅在前2个字符始终为“1 /”时才有效。如果您愿意,我可以将其重写为更常见的情况,例如'2.9 / 700'。