1

Oracleの行でnull以外のすべての値を選択する方法はありますか?

table A (id, aa, ab, ac)持っていると仮定します(1, 12, '', '')(2, '', 3, 4);

select * from A where id = 1;

行全体を示します。

しかし、nullではないすべてのフィールドを選択したいと思います。

この場合->

where id = 1 should return (1, 12)
and where id = 2 should return (2, 3, 4)

編集 :

なぜこれが欲しいのですか?約100個のフィールドがあるテーブルがあると想像してください。それらのほとんどは、ほぼすべての行でnullです。null以外のフィールドのみを表示するビューが必要です。これは一連の行に対しては実行できないことを私は知っています。それは矛盾するでしょう。しかし、主キーを使用して行を選択できる場合はいつでも、これが可能であるべきではありませんか?(case / other構文を使用してnull値フィールドを明示的に除外する必要はありません)

4

3 に答える 3

2

これは偽物です。同じクエリでも、クエリ自体ではなく、データの内部状態に応じて異なる結果セットが返されます。また、クライアント プログラムは、射影の 2 番目の列がA.aaまたはA.ab または 偶数であるかどうかをどのように判断するのA.acでしょうか?

動的 SQL、パイプライン化された関数、または ref カーソルの組み合わせを使用して、さまざまな解決策が考えられます。しかし、実際には、呼び出し元のプログラムが結果をどのように消費するかによって異なります。

于 2012-12-24T14:10:46.380 に答える
2

IMHO、同じプロジェクションで異なるタプルを要求しているため、このような構造はリレーショナル データ モデルに反します。

そのため、通常の sql 結果セットは、おそらくそのようなデータを保持するための最良の方法ではありません...
代わりに XML を使用します。

select xmlElement
           (
             "Row",
             XMLForest(id, aa, ab, ac)
           )
 from A

ここにsqlfiddleのデモがあります

于 2012-12-24T18:49:15.623 に答える
1

nullどのフィールドに値がないかを調べる方法の 1 つはUNPIVOT、データを調べることです。 ただし、これはデータを行ではなく列として表示します

select id, col, value
from
(
  select id, aa value, 'aa' col
  from tablea
  union all
  select id, ab value, 'ab' col
  from tablea
  union all
  select id, ac value, 'ac' col
  from tablea
) src
where id = 2
  and value is not null;

デモで SQL Fiddle を参照してください

サンプルデータが次の場合:

create table tableA
(
  id number,
  aa number,
  ab number,
  ac number
);

insert into tablea values(1, 12, null, null);
insert into tablea values(2, null, 3, 4);

検索id = 1結果は次のように表示されます。

| ID | COL | VALUE |
--------------------
|  1 |  aa |    12 |

を検索するとid=2、結果は次のようになります。

| ID | COL | VALUE |
--------------------
|  2 |  ab |     3 |
|  2 |  ac |     4 |
于 2012-12-24T13:17:21.540 に答える