1

有没有办法在 oracle 中连续选择所有非空值?

假设table A (id, aa, ab, ac)(1, 12, '', '')(2, '', 3, 4);

select * from A where id = 1;

给出整行。

但我想选择所有不为空的字段。

在这种情况下->

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

编辑 :

我为什么要这个?想象一下有一个包含大约一百个字段的表。他们中的大多数几乎每一行都为空。我想要一个只显示非空字段的视图。我知道这不能为一组行完成。那将是不一致的。但是,每当我可以使用它的主键来挑出一行时,这不应该是可能的吗?(无需使用案例/其他构造明确排除空值字段)

4

3 回答 3

2

恕我直言,这样的结构违反了关系数据模型,因为您在同一个投影中要求不同的元组。

因此,常规的 sql 结果集可能不是保存此类数据的最佳方式......
而是使用 XML:

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

这是一个 sqlfiddle 演示

于 2012-12-24T18:49:15.623 回答
2

这是假的。同一个查询将根据数据的内部状态返回不同的结果集,而不是查询本身。客户端程序应该如何确定投影中的第二列是否是A.aaA.ab 什至A.ac

有多种可能的解决方案,使用动态 SQL、管道函数或引用游标的某种组合。但这实际上取决于调用程序将如何使用结果。

于 2012-12-24T14:10:46.380 回答
1

找出哪些字段没有null值的一种方法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 回答