Oracle PLSQL:需要帮助理解订单中的案例说明吗

Oracle PLSQL:需要帮助理解订单中的案例说明吗,oracle,plsql,case,sql-order-by,Oracle,Plsql,Case,Sql Order By,我有一段代码,里面有一个案例: ORDER BY ( CASE WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA' ELSE '2'

我有一段代码,里面有一个案例:

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

  • “1AAAAA”和“2”的含义是什么
  • 这是什么意思 ||上限(id.name)


  • 在PL/SQL中,
    |


    排序的具体方式取决于查询的其余部分,但它似乎是将
    r.id介于900和999之间的记录放在其他记录之前,这些记录按
    id.name

    进行排序,在PL/SQL中,
    |
    是顺序


    排序的具体方式取决于查询的其余部分,但它似乎将
    r.id介于900和999之间的记录放在其他记录之前,这些记录按
    id.name

    大小写表达式计算为一个值

    CASE
      WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
      ELSE '2'
        || upper(id.name)
    END
    
    根据
    r.id
    的值,上述整个代码块的计算结果为'1AAAAA'或'2[value-of-r.id]'

    由于这是在
    order by
    子句中,因此该值将用于对结果进行排序,如下所示:

  • 首先列出
    r.id
    介于900和999之间的所有记录
  • 然后按
    r.id
    的升序列出所有其他记录(
    |
    是字符串连接运算符)

  • 大小写表达式的计算结果为一个值

    CASE
      WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
      ELSE '2'
        || upper(id.name)
    END
    
    根据
    r.id
    的值,上述整个代码块的计算结果为'1AAAAA'或'2[value-of-r.id]'

    由于这是在
    order by
    子句中,因此该值将用于对结果进行排序,如下所示:

  • 首先列出
    r.id
    介于900和999之间的所有记录
  • 然后按
    r.id
    的升序列出所有其他记录(
    |
    是字符串连接运算符)

  • 这里有一些数据。正如您所看到的,名称按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()。选定范围内的记录仅按日期排序,而其他记录仍按名称然后按日期排序:

    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>
    

    这里有一些数据。正如您所看到的,名称按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()。选定范围内的记录仅按日期排序,而其他记录仍按名称然后按日期排序:

    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>
    
    1.“1AAAAA”和“2”的含义是什么? 这是文字常量

    2.| | upper(id.name)是什么意思
    | |
    是SQL标准的连接运算符。”A'| |'B'产生'AB'

    IMHO,你的问题是整个
    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排序(后代)

    对于900到999之间的任何ID,案例只会返回'1AAAAA'(然后将按r.date订购,记得吗?“

    对于任何其他值,它将在id.name之前连接2

    这样可以确保id介于900和999之间的任何记录都出现在第一个“组”中,该组仅按日期降序排列。然后,第二个组将包含所有其他记录,按名称的上限排序,然后按日期排序

    您可能希望查看这些数据以了解其工作原理……只需将case表达式作为新列添加到select语句中

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

    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
    
    添加如下案例:

    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
    
    这将帮助您了解该表达式的情况,因为您将看到生成的数据作为查询的最后一列。

    1.“1AAAAA”和“2”的含义是什么? 这是文字常量

    2.| | upper(id.name)是什么意思
    | |
    是SQL标准的连接运算符。“A”| |“B”产生“AB”

    IMHO,你的问题是整个
    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排序(后代)

    对于900到999之间的任何ID,案例只会返回'1AAAAA'(然后将按r.date订购,记得吗?“

    对于任何其他值,它将在id.name之前连接2

    这样可以确保id介于900和999之间的任何记录都出现在第一个“组”中,该组仅按日期降序排列。然后,第二个组将包含所有其他记录,按名称的上限排序,然后按日期排序

    您可能希望查看这些数据以了解其工作原理……只需将case表达式作为新列添加到select语句中

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

    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
    
    添加如下案例:

    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
    

    这将帮助您了解该表达式的情况,因为您将看到生成的数据作为查询的最后一列。

    Typo?:“介于900和1AAAAA之间”应该是“介于900和999之间”。@Ken:是的,肯定是一个错误;我现在已经解决了。Typo?:“介于900和1AAAAA之间”应该是“介于900和999之间”@Ken:是的,肯定是打字错误;我现在已经改正了。