sql >> データベース >  >> RDS >> Oracle

条項による条件付き順序

    これはバグ5695629のようで、10gに対して発生したようで、まだ修正されていないようです(12cR2の時点で、まだ18を使用していません)。これは珍しいことです。

    注文する前にクエリを外側の選択でラップすることで、これを回避できます。

    select name, grade, marks
    from
    (
        SELECT
            name, grade, marks
        FROM
            students, grades
        WHERE
            min_mark <= marks
            AND   marks <= max_mark
            AND   marks >= 70
        UNION
        SELECT
            TO_CHAR('NULL') AS name, grade, marks
        FROM
            students, grades
        WHERE
            min_mark <= marks
            AND   marks <= max_mark
            AND   marks <= 69
    )
    order by grade desc,case when grade >= 1 
                         then  name 
                         when grade < 1 
                         then  marks
                         end ;
    

    しかし、nameとして およびmarks (おそらく)異なるデータ型(文字列と数値)であり、代わりに取得されます

    marksを変換できます 文字列に変換しますが、そうする場合は、結果の文字列をアルファベット順に並べ替えても番号の順序に一致するようにパディングする必要があります-マークは(おそらく-パーセンテージの場合は?)最大3桁である可能性があるため、厄介ですがもっともらしいです:

    select name, grade, marks
    from
    (
        ...
        <the main part of your query here as a subquery, as above>
        ...
    )
    order by grade desc,case when grade >= 8 
                         then  name 
                         when grade < 8 
                         then  to_char(marks, 'FM000')
                         end ;
    

    db<>フィドルデモ CTEを介して提供されるダミーデータを使用します。

    マークが3桁を超える可能性がある場合は、可能な最大長に一致するようにフォーマットマスクを変更してください。

    TO_CHAR('NULL') これらの行の名前列にリテラル文字列「NULL」が表示されるため、一部も奇妙です。文字列リテラルで開始するため、TO_CHAR() 一部は無意味です。'NULL' AS nameを使用してください。 直接。実際に空白にしたい場合は、null AS nameを使用できます。 そして、それはユニオンの最初のブランチからの一致する列式のデータ型と一致します(そしてそのエイリアスも取得します)。文字列型に明示的にキャストできます。 cast(null as varchar2(20)) AS name しかし、あまり意味がないようです。



    1. 列内の重複するエントリを検索する

    2. PDO+MySQLおよび壊れたUTF-8エンコーディング

    3. MySQLワークベンチでプロシージャを作成して実行する方法

    4. phpを使用してjson配列をmysqlデータベースに挿入する方法