Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从元组中选择非空的列_Sql_Null - Fatal编程技术网

Sql 从元组中选择非空的列

Sql 从元组中选择非空的列,sql,null,Sql,Null,想象一下,如果我们有一张桌子: 我是否可以编写一个SQL查询来给出以下结果,其中我可以得到不为null的列: | col1 | val1 | val5 | ---------------------- | A | 1 | 1 | 而不是使用单独的函数来做同样的事情 答案是否定的,不是在标准SQL中。select语句指定返回的特定列。不能更改列数 一种选择是切换到动态SQL,在动态SQL中,您将查询创建为字符串,然后执行该字符串。这种方法高度依赖于数据库 另一种选择是将所有值分组

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

我是否可以编写一个SQL查询来给出以下结果,其中我可以得到不为null的列:

| col1 | val1 | val5 | ---------------------- | A | 1 | 1 |
而不是使用单独的函数来做同样的事情

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

一种选择是切换到动态SQL,在动态SQL中,您将查询创建为字符串,然后执行该字符串。这种方法高度依赖于数据库

另一种选择是将所有值分组到一个列中,使用类似listag的内容。您的评论表明您正在使用Oracle


如果还需要非空的列名,可以使用listag和一个巨型case语句来实现。或者,您可以取消抽取数据以获得名称-值对,然后使用listagg重新聚合。

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

一种选择是切换到动态SQL,在动态SQL中,您将查询创建为字符串,然后执行该字符串。这种方法高度依赖于数据库

另一种选择是将所有值分组到一个列中,使用类似listag的内容。您的评论表明您正在使用Oracle


如果还需要非空的列名,可以使用listag和一个巨型case语句来实现。或者,您可以取消激活数据以获得名称-值对,然后使用ListAg重新聚合。

您没有指定正在使用的RDBMS,但可以取消激活数据以返回包含非空值的数据。如果没有UNPIVOT函数,则可以使用UNION ALL:

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

select col1, col, value
from yourtable
unpivot
(
  value
  for col in (val1, val2, val3, val4, val5)
) unpiv;
看。数据作为行而不是单独的列返回,但结果是:

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

您没有指定正在使用的RDBMS,但可以取消填充数据以返回包含非空值的数据。如果没有UNPIVOT函数,则可以使用UNION ALL:

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

select col1, col, value
from yourtable
unpivot
(
  value
  for col in (val1, val2, val3, val4, val5)
) unpiv;
看。数据作为行而不是单独的列返回,但结果是:

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

当然可以:从t中选择col1、val1、val5,其中col1='A'。说真的,应用于表以获得结果的规则是什么?为什么不返回B行和C行?为什么需要这样做?您不需要说明RDBMS,但它可能需要一个查询来确定包含NOTNULL的列,然后需要一个单独的动态SQL查询来返回实际结果。我只需要从表中选择col1、val1、val2、val3、val4、val5,并担心DBNull代码端。@DanielHilgarth:thnx作为回复,在这里,我只想选择不为null的列,可以使用简单的PLSQL func执行相同的操作,但想知道是否有办法从SQL查询本身执行此操作。是的,查询将是smthng lyk SELECT FROM table t,其中t.col1='A',您当然可以:从t中选择col1,val1,val5,其中col1='A'。说真的,应用于表以获得结果的规则是什么?为什么不返回B行和C行?为什么需要这样做?您不需要说明RDBMS,但它可能需要一个查询来确定包含NOTNULL的列,然后需要一个单独的动态SQL查询来返回实际结果。我只需要从表中选择col1、val1、val2、val3、val4、val5,并担心DBNull代码端。@DanielHilgarth:thnx作为回复,在这里,我只想选择不为null的列,可以使用简单的PLSQL func执行相同的操作,但想知道是否有办法从SQL查询本身执行此操作。是的,查询将是smthng lyk SELECT FROM table t,其中t.col1='A'像一个符咒一样工作!!!谢谢!!:我并没有完全预料到,但事实证明这对我来说很容易!!工作就像一个魅力!!!谢谢!!:我并没有完全预料到,但事实证明这对我来说很容易!!