0

テーブルがあるとします。

| | 列1 | val1 | val2 | val3 | val4 | val5 |
-------------------------------------------
| | あ | 1 | null | null | null | null | null | null | 1 |
| | ビ | null | null | 1 | null | null | 1 | null | null |
| | シー | 1 | null | null | 1 | null | null | null | null |

そして、次の結果を得るために SQL クエリを記述できますか。ここで、null ではない列を取得できます。

| | 列1 | val1 | val5 |
----------------------
| | あ | 1 | 1 |

別の関数を使用して同じことを行うのではなく?

4

2 に答える 2

2

使用しているRDBMSを指定しませんでしたが、データのピボットを解除して、null以外の値を含むデータを返すことができますUNPIVOT関数がない場合は、 UNION ALL:を使用できます。

select col1, 'val1' col, val1
from yourtable
where val1 is not null
union all
select col1, 'val2' col, val2
from yourtable
where val2 is not null
union all
select col1, 'val3' col, val3
from yourtable
where val3 is not null
union all
select col1, 'val4' col, val4
from yourtable
where val4 is not null
union all
select col1, 'val5' col, val5
from yourtable
where val5 is not null

SQL FiddlewithDemoを参照してください。

unpivot関数を備えたRDBMSがある場合、クエリは次のようになります。

select col1, col, value
from yourtable
unpivot
(
  value
  for col in (val1, val2, val3, val4, val5)
) unpiv;

SQL FiddlewithDemoを参照してください。データは個別の列ではなく行として返されますが、結果は次のようになります。

| COL1 |  COL | VALUE |
-----------------------
|    A | val1 |     1 |
|    A | val5 |     1 |
|    B | val2 |     1 |
|    B | val4 |     1 |
|    C | val1 |     1 |
|    C | val3 |     1 |
于 2013-02-05T14:34:44.180 に答える
2

答えは「いいえ」です。標準 SQL にはありません。このselectステートメントは、返される特定の列を指定します。列数を変更することはできません。

1 つのオプションは、クエリを文字列として作成し、それを実行する「動的」SQL に切り替えることです。この方法は、データベースに大きく依存します。

別の代替手段は、次のようなものを使用して、すべての値を単一の列にグループ化するlistaggことです(あなたのコメントは、Oracleを使用していることを示唆しています)。

NULL 以外の列名も必要な場合はlistagg、巨大なcaseステートメントを使用してこれを行うことができます。または、データのピボットを解除して名前と値のペアを取得し、 を使用して再集計することもできますlistagg

于 2013-02-05T14:29:32.257 に答える