ホームページ  >  記事  >  データベース  >  ORACLE の ORDER BY のさまざまなソートについて話しましょう

ORACLE の ORDER BY のさまざまなソートについて話しましょう

WBOY
WBOY転載
2022-03-17 18:49:095897ブラウズ

この記事では、Oracle に関する関連知識をお届けします。主に、単一フィールドによる並べ替え、複数フィールドによる並べ替え、部分文字列による並べ替えなど、ORDER BY の複数の並べ替えに関連する問題を紹介します。これはみんなに役立ちます。

ORACLE の ORDER BY のさまざまなソートについて話しましょう

推奨チュートリアル: 「Oracle Learning Tutorial

1. 単一フィールドによる並べ替え

昇順: ORDER BY ASC (デフォルト)

降順: ORDER BY DESC

指定された順序でクエリ結果を返します。実際にデータを抽出したりレポートを生成したりするときは、通常、特定の順序でクエリ結果を表示する必要があります。たとえば、部門に雇用されている従業員に関する情報を表示したい場合です。

SELECT empno, ename, hiredate FROM emp WHERE deptno = 10 ORDER BY hiredate ASC;

クエリ結果を並べ替えるためにこの種のステートメントを作成できる人はたくさんいますが、「ORDER BY recruitate ASC」に加えて、「ORDER BY 3」としても記述できます。 ASC" 、3 番目の列による並べ替えを意味します。

SELECT empno, ename, hiredate FROM emp WHERE deptno = 10 ORDER BY 3 ASC;

値が不確実な場合、この方法を使用すると非常に便利です。ただし、

データを使用して列の位置を置き換えるのは、次の順序でのみ使用できます。 by 句。他の場所では使用できません。

2. 複数のフィールドで並べ替えます。

複数の列で並べ替えて増加または減少があった場合はどうすればよいですか?たとえば、部門番号で昇順、給与で降順に並べ替える場合、ASC は昇順、DESC は降順という 2 つのキーワードがあるため、order by の後に 2 つの列を追加し、それぞれ ASC と DESC をマークします。

SELECT empno, deptno, sal, ename, job FROM emp ORDER BY 2 ASC, 3 DESC;

次の図に示すように、次のことを図の形式で紹介します。複数の列を並べ替えるとき、前の列に重複した値がある場合 (たとえば、 deptno = 10 の場合、データは 3 行あります)、その後の並べ替えはのみ役に立ちます。これは、前の列でデータをいくつかのグループに分割し、各グループのデータを次の列で並べ替えることと同じです。

3. 部分文字列による並べ替え

部分文字列による並べ替え顧客の電話番号を最後の番号の順序で記録する簡単な方法があります。検索時にクエリの範囲をすばやく絞り込み、顧客の認識を高めることができます。このように並べ替えたい場合はどうすればよいでしょうか?この関数を使用して、次の数ビットに必要な情報を取得するだけです。

SELECT last_name AS 名称,
       phone_number AS 号码,
       salary as 工资,
       substr(phone_number, -4) AS 尾号
  FROM hr.employees
 WHERE rownum < 5
 ORDER BY 4;

データをクエリできる限り、対応する情報に従って並べ替えることができることがわかります。

4. TRANSLATE

構文形式: TRANSLATE(expr, from_string, to_string)

例は次のとおりです:

SELECT TRANSLATE( &#39;ab 你好 bcadefg&#39;, &#39;abcdefg&#39;, &#39;1234567&#39; ) AS NEW_STR FROM DUAL;

from_string と to_string は文字単位であり、対応する文字が 1 つずつ置き換えられます。

to_string が空の場合は、null 値を返します。

SELECT TRANSLATE( &#39;ab 你好 bcadefg&#39;, &#39;abcdefg&#39;, &#39;&#39; ) AS NEW_STR FROM DUAL;

to_string の対応する位置に文字がない場合は、null 値を返します。 to_string、delete from_string にリストされている文字が削除されます。

SELECT TRANSLATE( &#39;ab 你好 bcadefg&#39;, &#39;1abcdefg&#39;, &#39;1&#39; ) AS NEW_STR FROM DUAL;

5. 数字と文字が混在する文字列を文字で並べ替えます

まず、次のように VIEW を作成します:

CREATE OR REPLACE VIEW V 
as 
SELECT empno || &#39; &#39; || ename AS data FROM emp;
select * from V;

この要件は少し難しくなりますが、中に文字 (つまり、元の列の名前) が見えますか?その中でアルファベット順に並べる必要があります (列 ename)。

次に、最初に文字を削除する必要があります。translate の replace 関数を使用して、数字とスペースを空のスペースに置き換えることができます:

SELECt data, translate (data, &#39;- 0123456789&#39;, &#39;-&#39; )AS ename
  FROM v
 ORDER BY 2;

6 . ソートされた null 値の処理

Oracle はデフォルトで null 値を後ろにソートします。null 値 (emp.comm など) を前に表示したい場合はどうすればよいですか? NVL (comm など) を使用しますか? 、-1)?

SELECT ename, sal, comm, nvl(comm, - 1) order_col FROM emp ORDER BY 4;

也许很多人都是用的这种方法,但这种方法需要对列类型及其中保存的数据有所了解才行,而且保存的数据如果有变化,该语句就要重新维护。
其实可以用关键字 NULLS FIRST和 NULLS LAST。

空值在前

SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS FIRST;

空值在后

SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS LAST;

是不是要方便得多?

7. 根据条件取不同列中的值来排序

有时排序的要求会比较复杂,比如:领导对工资在1000到2000元之间的员工更感兴趣,于是要求工资在这个范围的员工要排在前面,以便优先査看。
对于这种需求,我们可以在查询中新生成一列,用多列排序的方法处理:

SELECT empno AS 编码,
       ename AS 姓名,
       CASE
         WHEN sal > 1000 AND sal < 2000 THEN
          1
         ELSE
          2
       END AS 级别,
       sal AS工资
  FROM emp
 WHERE deptno = 30
 ORDER BY 3, 4;

可以看到,950与2850都排在了后面,也可以不显示级别,直接把 case when放在order by中

SELECT empno AS 编码, ename AS 姓名, sal AS工资
  FROM emp
 WHERE deptno = 30
 ORDER BY CASE
            WHEN sal >= 1000 AND sal < 2000 THEN
             1
            ElSE
             2
          END,
          3;

 

推荐教程:《Oracle教程

以上がORACLE の ORDER BY のさまざまなソートについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。