1

テーブルに 50 列があり、1 行しか返されません。50 列の 1 行を 50 行と 1 列で表示したいと考えています。

Oracleクエリを提案してくれる人はいますか?

4

2 に答える 2

4

このような1行を使用UNPIVOTして、値を持つ列のみを取得できます

SELECT colvalue 
  FROM
(
  SELECT * 
    FROM Table1
  UNPIVOT INCLUDE NULLS
  (
    colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
  )
);

出力例:

| | コルバリュー |
------------
| | 1 |
| | 2 |
| | (ヌル) |
|…………|

ピボットされたテーブルの列名を持つ列が必要な場合は、外側の選択を捨てるだけです

SELECT * 
  FROM Table1
UNPIVOT INCLUDE NULLS
(
  colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
);

出力例:

| | COLS | コルバリュー |
--------------------
| | COL1 | 1 |
| | COL2 | 2 |
| | COL3 | (ヌル) |
| | …… |………… |

これがSQLFiddleのデモです

于 2013-06-21T03:30:00.390 に答える
0

多くの入力に備えてください:) OracleにはUNPIVOT機能がありますが、結果に少なくとも2つの列が必要なため、状況では機能しません.

まず、1 から 50 までのカウンターが必要です。次のようにクエリを実行できます。

SELECT LEVEL as Counter FROM DUAL CONNECT BY LEVEL <= 50

このクエリを実行すると、結果として 1 ~ 50 の数字が得られます。それを基礎として、完全な(っぽい)クエリは次のとおりです。

WITH Cols AS (
  SELECT LEVEL as Counter
  FROM DUAL
  CONNECT BY LEVEL <= 50
)
SELECT
  CASE Cols.Counter
    WHEN 1 THEN Col1
    WHEN 2 THEN Col2
    WHEN 3 THEN Col3
    . . .
    WHEN 50 THEN Col50
  END AS myColumn
FROM myTable
CROSS JOIN Cols
ORDER BY Cols.Counter

すべての列は同じデータ型である必要があることに注意してください。文字、数値、日付が混在している場合は、それらをすべて文字に変換する必要があります。

質問で述べたように、このクエリはテーブル内の1 つの行を想定していることに注意してください。複数の行がある場合は、 で終了する必要がありますORDER BY a-column-that-identifies-the-row, Cols.Counter

于 2013-06-21T03:05:29.027 に答える