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 ;
谁能解释一下:
在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:是的,肯定是打字错误;我现在已经改正了。