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

MySQLで列の値をシフトする方法は?

    coalesce()を使用する およびサブクエリ

    select id, o1, 
           CASE WHEN o2!=o1 THEN o2 END o2,
           CASE WHEN o3!=o2 THEN o3 END o3 
    FROM
    ( select id, coalesce(org1,org2,org3) o1,
                 coalesce(org2,org3)      o2,
                          org3            o3 from tbl ) t
    

    更新

    R2D2が非常に正しく見つけたので、前の答えは十分ではありませんでした。残念ながら、mysqlでCTEを実行することはできないため、代わりにビューを作成しました(例を別の列org4で拡張しました ):

    CREATE VIEW vert AS 
    select id i,1 n, org1 org FROM tbl where org1>'' UNION ALL
    select id,2, org2 FROM tbl where org2>'' UNION ALL
    select id,3, org3 FROM tbl where org3>'' UNION ALL
    select id,4, org4 FROM tbl where org4>'';
    

    このビューを使用すると、次のことが可能になります。

    SELECT id,
    (select org from vert where i=id order by n limit 1) org1,
    (select org from vert where i=id order by n limit 1,1) org2,
    (select org from vert where i=id order by n limit 2,1) org3,
    (select org from vert where i=id order by n limit 3,1) org4
    FROM tbl
    

    美しくはありませんが、仕事は終わります。こちらをご覧ください: SQLfiddle

    入力:

    | id |   org1 |   org2 |    org3 |   org4 |
    |----|--------|--------|---------|--------|
    |  1 |     HR | (null) |   Staff |     IT |
    |  2 | (null) |     IT |     Dev | (null) |
    |  3 | (null) | (null) | Finance |     HR |
    

    出力:

    | id |    org1 |  org2 |   org3 |   org4 |
    |----|---------|-------|--------|--------|
    |  1 |      HR | Staff |     IT | (null) |
    |  2 |      IT |   Dev | (null) | (null) |
    |  3 | Finance |    HR | (null) | (null) |
    


    1. MySQLのリレーショナルデータベース設計に関するクイックヒント

    2. OracleSQLでの日付の比較

    3. python-Djangoを使用してUnicode文字をMySQLに保存する際の問題

    4. データベース設計101:MySQLのパーティション