-1

オプション1-オプション15列を持つテーブルの選択肢のデータベースにはいくつかの列があります。ユーザーが選択していない場合、列のデータはnullになる可能性があります。それ以外の場合は「y」になります。データがある列を取得する必要があります'y'.

column_id choice1 choic2 choice3......15

   1         null  y      null
   2         y     null   null

特定の列IDに対してSQLクエリを使用してこれを取得するにはどうすればよいですか?

4

2 に答える 2

1

使用しているOracleのバージョンを指定していません。UNPIVOTただし、またはUNION ALL:を使用してこのデータをクエリできます。

UNPIVOTバージョン(デモ付きSQLフィドルを参照):

select *
from yourtable
unpivot
(
  val
  for col in (choice1, choice2, choice3)
) u
where val = 'y'

UNION ALLバージョン(デモ付きSQLフィドルを参照):

select *
from
(
  select columnid, 'choice1' col, choice1 val
  from yourtable
  union all
  select columnid, 'choice2' col, choice2 val
  from yourtable
  union all
  select columnid, 'choice3' col, choice3 val
  from yourtable
) x
where val = 'y'

このプロセスを実行すると、複数の列ではなく1つの列でデータに簡単にアクセスできるようになります。

于 2012-10-10T11:49:34.883 に答える
1

データベース テーブルの設計とは逆の方法でデータベース テーブルを使用しようとしています。

いくつかの基準に基づいてフィールドからデータを選択する必要があるときに、データが存在するときにテーブルからフィールド (列) を選択しようとしています。また、システムに別のオプションを追加するとどうなりますか? この新しいオプションを認識するには、テーブルのデザインとテーブルを使用するすべての手順/アプリケーションを変更する必要があると思います。

オプションを行として含むテーブルを作成してから、ユーザーのすべての行を選択することをお勧めします。サンプル データ (各ユーザーが 1 つのオプションのみを選択している) から、次の 2 つの行が表示されます。

user_id option_number
------- -------------
      1             2
      2             1

ユーザー 1 がさらにオプションを選択する場合は、さらに行を追加します。

user_id option_number
------- -------------
      1             2
      1             5
      1            10
      1            15
      2             1

テーブルの主キーは(user_id, option_number)、ユーザーが同じオプションを 2 回選択できないようにすることです。すべての可能なオプション番号を持つルックアップ テーブル (または制約) との関係により、無効なオプションが選択されるのを防ぐことができます。

于 2012-10-10T11:37:32.070 に答える