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

null値ではないn番目に相当する合体-MySQL

    このソリューションの使用をお勧めするかどうかはわかりません...データの正規化は常により良い選択ですが、いくつかの文字列関数でプレーンSQLを使用して答えたいと思いました。このクエリはあなたが探しているものを返すはずです:

    SELECT
      Name,
      Changes,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
      REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
    FROM (
      SELECT
        Name,
        CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
      FROM
        TableA
    ) s
    

    すべての値をコンマで区切った文字列に連結し、文字列の最後に2つのコンマを付けます(とにかく1つのコンマで十分ですが、2つ入れて、最後の1つを無視する方が簡単です...)。 m CONCAT_WSを使用すると、null値が自動的にスキップされ、結果の文字列はAug-12,Jun-12,Apr-12,,のようになります。 。

    次に、外部クエリで、SUBSTRIG_INDEXを使用して文字列のn番目の要素を抽出しています。データベースを正規化することをお勧めしますが、迅速な修正が必要な場合は、このソリューションが出発点として適している可能性があります。

    こちら で動作することを確認してください 。

    変更がない場合はNULL値を返しませんが、代わりに空の文字列を返すことに注意してください。これは必要に応じて変更できます。



    1. MySQL Select:WHERE(time now)=BETWEEN tablevalue AND tablevalue

    2. .NET3.5でのDateTimeシリアル化のベストプラクティス

    3. SQL Server(T-SQL)で「date」を「datetimeoffset」に変換する例

    4. Oracleの文字列連結演算子とは何ですか?