多列顺序时的CASE表达式

时间:2018-08-18 14:45:16

标签: sql oracle case-when

如果发布的值为0,则根据以下列进行排序:isl_tarisl_saatref_kodisl_refkayit_no

发布值(如果为1,则根据此列进行排序):tutar

plsql table ss

此脚本不起作用:

我想按第二种情况排序

select t.*
  from TEMP_HESAP_HAREKET t

 order by case 1
            when 0 then
             TO_NUMBER(TO_CHAR(ISL_TAR, 'YYYYMMDD') ||
                       SUBSTR(ISL_SAAT, 1, 2) || SUBSTR(ISL_SAAT, 4, 2))
          end asc,
          REF_KOD asc,
          ISL_REF asc,
          KAYIT_NO asc,
          case 1 
            when 1 then
              tutar end

2 个答案:

答案 0 :(得分:1)

我假设CASE被放置在某个位置之后的值,也许是由某个触发该语句的应用程序引起的。

然后,您可以订购五个CASE

如果值为0,则在0的情况下,从要排序的列列表中返回相应的列。

如果值是CASE,则在第一个tutar中返回1。在所有其他CASE中,如果值为1,则始终返回相同的值或根本不返回任何值(NULL),如果没有WHEN完全在那里。

ORDER BY CASE ?
           WHEN 0 THEN
             ISL_TAR
           WHEN 1 THEN
             TUTAR
         END ASC,
         CASE ?
           WHEN 0 THEN
             ISL_SAAT
         END ASC,
         CASE ?
           WHEN 0 THEN
             REF_KOD
         END ASC,
         CASE ?
           WHEN 0 THEN
             ISL_REF
         END ASC,
         CASE ?
           WHEN 0 THEN
             KAYIT_NO
         END ASC

?必须替换为01

但是,如果有一个将值放在CASE之后的应用程序,则可能是一种“更干净”(更易于阅读,理解和维护)的方式,可以使它更改完整的ORDER BY表达式而不是放置01

答案 1 :(得分:1)

您似乎想要:

 order by (case 1 when 1 then tutar end),  -- handle that case first
           TO_NUMBER(TO_CHAR(ISL_TAR, 'YYYYMMDD') ||
                       SUBSTR(ISL_SAAT, 1, 2) || SUBSTR(ISL_SAAT, 4, 2))
            REF_KOD asc,
            ISL_REF asc,
            KAYIT_NO asc

我认为isl_tar上的表达式是正确的。似乎只需一个简单的列引用就足够了。