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

他の列に基づく値と選択からpostgresで列を作成するにはどうすればよいですか?

    重要な注意:ビュー を作成します 現在のテーブルに基づいており、スキーマを非正規化するため、新しい列の追加は避けました。続きを読むこちら 。

    また、qoutingを避けるために、すべての識別子に小文字の名前を使用します。

    • GPA_TXTを作成するには to_char()を使用できるフィールド 関数:to_char(gpa, 'FM09.0')FM 結果の文字列の前のスペースを避けます);
    • 2番目のフィールドには、GPAを使用します GPA_TXTではありません 数値比較用。 CASEで詳細を確認できます ドキュメント で構成します 、ただし、ブロックは次のようになります:

      CASE WHEN gpa >= 3.3 THEN 'A'
           WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
           WHEN gpa > 0 THEN 'C'
           ELSE 'F' END
      

    申し訳ありませんが、GPAごとに成績がどのように割り当てられているかわかりません。それに応じて調整してください。

    ビューの結果のクエリは次のようになります( SQLFiddle にもあります ):

    SELECT name,major,gpa,
           to_char(gpa, 'FM09.0') AS gpa_txt,
           name||'-'||major||'-Grade'||
      CASE WHEN gpa >= 3.3 THEN 'A'
           WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
           WHEN gpa > 0 THEN 'C'
           ELSE 'F' END || '-' || to_char(gpa, 'FM09.0') AS adesc
      FROM atab;
    

    ビューを作成するには、CREATE VIEW aview ASを前に付けるだけです。 このクエリの前。

    編集

    それでも列を追加する場合は、次の方法でうまくいくはずです。

    ALTER TABLE atab ADD gpa_txt text, ADD adesc text;
    UPDATE atab SET
        gpa_txt = to_char(gpa, 'FM09.0'),
        adesc = name||'-'||major||'-Grade'||
          CASE WHEN gpa >= 3.3 THEN 'A'
               WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
               WHEN gpa > 0 THEN 'C'
               ELSE 'F' END || '-' || to_char(gpa, 'FM09.0');
    


    1. pdoを使用して名前で行グループを合計する

    2. SQLで優先順位を実装する方法(postgres)

    3. ORA-01264:ログ・ファイル名を作成できません

    4. PostgreSQL:psqlコマンドを使用してPostgresインスタンスにリモート接続する