【问题标题】:Selecting the columns which are not null from a tuple从元组中选择不为空的列
【发布时间】:2013-01-20 10:48:15
【问题描述】:

想象一下,如果我们有一张桌子:

| col1 | val1 | val2 | val3 | val4 | val5 | ------------------------------------------ |一个 | 1 |空 |空 |空 | 1 | |乙|空 | 1 |空 | 1 |空 | | C | 1 |空 | 1 |空 |空 |

我可以编写一个 SQL 查询来给我以下结果,我可以在其中获取不为空的列:

| col1 | val1 | val5 | ---------------------- |一个 | 1 | 1 |

而不是使用单独的函数来做同样的事情?

【问题讨论】:

  • 你当然可以:select col1, val1, val5 from t where col1 = 'A'。严肃地说,应用于表格以获得结果的规则是什么?为什么没有返回行BC
  • 为什么需要这样做?您没有说明 RDBMS,但它可能需要一个查询来确定包含 NOT NULL 的列,然后是一个单独的动态 SQL 查询来返回实际结果。
  • 我只需 SELECT col1, val1, val2, val3, val4, val5 FROM Table 并担心 DBNull 代码方面的问题。
  • @DanielHilgarth:谢谢回复,这里我只想选择不为空的列,可以用一个简单的 PLSQL 函数做同样的事情,但想知道是否有办法做它来自 SQL 查询本身。是的,查询将是 smthng lyk " SELECT FROM table t WHERE t.col1 = 'A'

标签: sql null


【解决方案1】:

您没有指定您使用的 RDBMS,但您可以unpivot 数据以返回包含非空值的数据。如果您没有UNPIVOT 函数,那么您可以使用UNION ALL

select col1, 'val1' col, val1
from yourtable
where val1 is not null
union all
select col1, 'val2' col, val2
from yourtable
where val2 is not null
union all
select col1, 'val3' col, val3
from yourtable
where val3 is not null
union all
select col1, 'val4' col, val4
from yourtable
where val4 is not null
union all
select col1, 'val5' col, val5
from yourtable
where val5 is not null

SQL Fiddle with Demo

如果您有一个带有 unpivot 函数的 RDBMS,那么查询将类似于以下内容:

select col1, col, value
from yourtable
unpivot
(
  value
  for col in (val1, val2, val3, val4, val5)
) unpiv;

SQL Fiddle with Demo。数据作为行而不是单独的列返回,但结果是:

| COL1 |  COL | VALUE |
-----------------------
|    A | val1 |     1 |
|    A | val5 |     1 |
|    B | val2 |     1 |
|    B | val4 |     1 |
|    C | val1 |     1 |
|    C | val3 |     1 |

【讨论】:

  • 像魅力一样工作!!!非常感谢!! :D 并不完全符合我的预期,但事实证明这对我的目的来说很容易!
【解决方案2】:

答案是“否”,而不是标准 SQL。 select 语句指定返回的特定列。您不能更改列数。

一种选择是切换到“动态”SQL,将查询创建为字符串,然后执行。用于此的方法高度依赖于数据库。

另一种选择是将所有值分组到一个列中,使用 listagg 之类的东西(您的评论表明您使用的是 Oracle)。

如果您还想要非 NULL 列名,您可以使用 listagg 和巨大的 case 语句来完成此操作。或者,您可以取消透视数据以获取名称-值对,然后使用 listagg 重新聚合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多