2011-04-01 29 views

回答

3

在PL/SQL,||concatenation operator

排序的确切发生方式取决于查询的其余部分,但它看起来像是将其他记录按r.id BETWEEN 900 AND 999排在其他记录之前,这些记录按id.name排序。

3

壳体表达式求值

CASE 
    WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA' 
    ELSE '2' 
    || upper(id.name) 
END 

与任一评价为“1AAAAA”或“2 [value-of-r.id]”取决于的值的代码全上述嵌段r.id

由于这是order by子句中这个值将被用来对结果进行排序如下:

  1. 第一列表中的所有记录,其中r.id是900和999之间
  2. 然后列出升序所有其他记录订单号为r.id||是字符串连接运算符)。
+1

错字?:“900与1AAAAA之间”应该是“900与999之间”。 – Ken 2011-04-01 15:35:20

+0

@ Ken:肯定是一个错字;我现在修好了。 – 2011-04-03 07:33:00

1

以下是一些数据。正如你所看到的名字排序ASCII顺序,这是不完全一样的字母顺序:

SQL> select id, name, somedate 
    2 from t42 
    3 order by name, somedate 
    4/

     ID NAME  SOMEDATE 
---------- ---------- --------- 
     8 Billington 24-MAR-11 
     13 Cave  19-MAR-11 
     4 Clarke  28-MAR-11 
     919 Feuerstein 13-MAR-11 
     16 Gasparotto 16-MAR-11 
     1014 KULASH  18-MAR-11 
     1 Kestelyn 31-MAR-11 
     917 Kishore 15-MAR-11 
     2 Lira  30-MAR-11 
     6 PADFIELD 26-MAR-11 
     11 Rigby  21-MAR-11 
     1007 Robertson 25-MAR-11 
     12 SCHNEIDER 20-MAR-11 
     9 SPENCER 23-MAR-11 
     3 TRICHLER 29-MAR-11 
     918 VERREYNNE 14-MAR-11 
     10 boehmer 22-MAR-11 
     15 hall  17-MAR-11 
     920 poder  12-MAR-11 
     5 van wijk 27-MAR-11 
     1021   11-MAR-11 

21 rows selected. 

SQL> 

排序由upper(name)使得它不区分大小写:

SQL> select id, name, somedate 
    2 from t42 
    3 order by upper(name), somedate 
    4/

     ID NAME  SOMEDATE 
---------- ---------- --------- 
     8 Billington 24-MAR-11 
     10 boehmer 22-MAR-11 
     13 Cave  19-MAR-11 
     4 Clarke  28-MAR-11 
     919 Feuerstein 13-MAR-11 
     16 Gasparotto 16-MAR-11 
     15 hall  17-MAR-11 
     1 Kestelyn 31-MAR-11 
     917 Kishore 15-MAR-11 
     1014 KULASH  18-MAR-11 
     2 Lira  30-MAR-11 
     6 PADFIELD 26-MAR-11 
     920 poder  12-MAR-11 
     11 Rigby  21-MAR-11 
     1007 Robertson 25-MAR-11 
     12 SCHNEIDER 20-MAR-11 
     9 SPENCER 23-MAR-11 
     3 TRICHLER 29-MAR-11 
     5 van wijk 27-MAR-11 
     918 VERREYNNE 14-MAR-11 
     1021   11-MAR-11 

21 rows selected. 

SQL> 

CASE()改变这进一步首先将所有记录分组在所规定的ID范围内,然后将所有其他记录分组。在选定范围的记录只是由日期排序,而其他记录仍然由名称日期排序:

SQL> select id, name, somedate 
    2 from t42 
    3   ORDER BY 
    4   (
    5    CASE 
    6     WHEN id BETWEEN 900 AND 999 THEN '1AAAAA' 
    7     ELSE '2' 
    8      || upper(name) 
    9    END) ASC, 
10   somedate DESC 
11/

     ID NAME  SOMEDATE 
---------- ---------- --------- 
     917 Kishore 15-MAR-11 
     918 VERREYNNE 14-MAR-11 
     919 Feuerstein 13-MAR-11 
     920 poder  12-MAR-11 
     1021   11-MAR-11 
     8 Billington 24-MAR-11 
     10 boehmer 22-MAR-11 
     13 Cave  19-MAR-11 
     4 Clarke  28-MAR-11 
     16 Gasparotto 16-MAR-11 
     15 hall  17-MAR-11 
     1 Kestelyn 31-MAR-11 
     1014 KULASH  18-MAR-11 
     2 Lira  30-MAR-11 
     6 PADFIELD 26-MAR-11 
     11 Rigby  21-MAR-11 
     1007 Robertson 25-MAR-11 
     12 SCHNEIDER 20-MAR-11 
     9 SPENCER 23-MAR-11 
     3 TRICHLER 29-MAR-11 
     5 van wijk 27-MAR-11 

21 rows selected. 

SQL> 
0
1.什么是“1AAAAA”和“2”的意思吗?

这是字面常量。

2.什么意思? upper(id.name)

||是SQL标准连接运算符。 'A'|| 'B'产生'AB'。

恕我直言,你的问题是什么,整个order by case手段,所以,走一步看一步:

   ORDER BY 
        (
         CASE 
          WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA' 
          ELSE '2' 
           || upper(id.name) 
         END) ASC, 
        r.date DESC ; 

这会为了你的结果通过的情况下表达式求值(上升)的结果集,然后用r .date(后代)。

的情况下,将刚刚返回“1AAAAA”为900和999之间的任意ID(这会然后r.date订购,还记得吗?”

对于任何其它的值,它会在ID前串连2。

这确保了任何记录的ID在900到999之间出现在第一个“组”中,它是按日期顺序排序的,然后第二个组包含所有其他记录,按照名称,然后是日期

您可能想要查看这些数据以了解它是如何工作的......只需将case表达式添加到您的sele ct声明作为新的专栏。

例如,如果您的查询开始是这样的:

SELECT r.id, id.name 
    FROM 

添加的情况是这样的:

SELECT r.id, id.name 
     , 
     CASE 
     WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA' 
     ELSE '2'|| upper(id.name) 
     END ORDER_CRITERIA 
    FROM 

这将帮助您了解正在发生的事情与表达,你会看到生成的数据作为查询的最后一列。