2012-12-24 22 views
0

有没有办法在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) 

编辑:

为什么我要这样?想象一下有一张桌子有大约一百个字段。 几乎每行都是空白。 我想要一个只显示非空字段的视图。 我知道这不能做一组行。这将是不一致的。 但是,无论何时我可以使用主键单列出一行,这应该是可能的吗? (而不必明确排除使用情况/其他构造空值字段),您可以找出哪些领域没有null

+1

这是不可能的 - 或者是在至少真的很复杂。你想通过这样做来达到什么目的? –

+1

你不能有选择*返回一个有限的列设置(至少不是有效的),并且如果你做了'select * from A where id in(1,2)'那么什么?返回所有包含一些行的列还是空的?你可以使用case语句连接所有的非空列,这样它们都作为一个列出现,当aa不为空然后aa结束时'','||当ab不为空的情况下......'等等,但是您可能会遇到字符串长度问题。 (mycol('AA',12))和'2,myarr(mycol('AB',3),mycol(''))或者你可以为每行返回一个数组AC',4)'来解决这个问题。那会有用吗? – DazzaL

回答

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 with Demo

如果样本数据:

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 | 
2

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

有多种可能的解决方案,使用动态SQL,流水线函数或引用游标的某种组合。但这要看调用程序如何使用结果。

1

恕我直言,这样的结构是针对Relational Data Model,因为你在同一投影中要求不同的元组。

所以,一个普通的SQL结果集可能是不举行这样的数据的最佳方式...
而是使用XML:

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

Here is a sqlfiddle demo

相关问题