排除空

时间:2015-11-16 19:48:50

标签: sql sql-server

我正在尝试在SQL Server 2012中创建一个视图,该视图排除条目为空的列(在此处用0表示,因此它更容易阅读)。 我的基础数据是

╔════╦══════╦══════╦══════╦══════╦══════╗
║ ID ║ Col1 ║ Col2 ║ Col3 ║ Col4 ║ Col5 ║
╠════╬══════╬══════╬══════╬══════╬══════╣
║  1 ║    1 ║    0 ║    0 ║    0 ║    5 ║
║  2 ║    1 ║    2 ║    3 ║    0 ║    5 ║
║  3 ║    0 ║    0 ║    0 ║    0 ║    0 ║
║  4 ║    0 ║    2 ║    3 ║    0 ║    0 ║
╚════╩══════╩══════╩══════╩══════╩══════╝

我想回来的是

╔════╦══════╦══════╦══════╦══════╗
║ ID ║ Res1 ║ Res2 ║ Res3 ║ Res4 ║
╠════╬══════╬══════╬══════╬══════╣
║  1 ║    1 ║    5 ║    0 ║    0 ║
║  2 ║    1 ║    2 ║    3 ║    5 ║
║  3 ║    0 ║    0 ║    0 ║    0 ║
║  4 ║    2 ║    3 ║    0 ║    0 ║
╚════╩══════╩══════╩══════╩══════╝

在这种情况下,由于第4列在所有条目中的值为0,因此未将其包括在内。 ID1返回1和5跳过0,并且由于ID2有4列,因此填充0。如果所有值都为0,则只返回Res1为0或没有列,只返回ID。

希望这很清楚。我无法解释它。

4 个答案:

答案 0 :(得分:2)

评论太长了。

你无法真正做你想做的事。查询,视图和用户定义的函数返回一组特定的列。列集是事先定义的。所以,你无法删除它们。

可以创建一个动态查询,该查询仅包含当前不是NULL的列。或者,您可以使用所需的列创建XML数据结构。但是,视图中的列在创建视图时是固定的,在运行视图时无法添加和删除。

答案 1 :(得分:0)

正如Gordon Linoff所说,你可以使用动态SQL做到这一点,但是 - 我不会。

在您的应用程序代码中处理此逻辑,而不是数据库。 SQL Server不应该做得很好。代码难以维护。

答案 2 :(得分:0)

嗯,这是可能的,但查询会得到一些非常复杂的表达式。

第一栏非常简单:

Res1 = coalesce(Col1, Col2, Col3, Col4, Col5, 0),

第二列变得更复杂,因为它必须确定第一个使用的值在哪里获得第二个值:

Res2 = case
    when Col1 is not null then coalesce(Col2, Col3, Col4, Col5, 0)
    when Col2 is not null then coalesce(Col3, Col4, Col5, 0)
    when Col3 is not null then coalesce(Col4, Col5, 0)
    when Col4 is not null then coalesce(Col5, 0)
    else 0
  end,

从那里它变得更加复杂。下一个值必须确定前两个值的位置。我甚至都不打算写那个。

答案 3 :(得分:0)

如果删除了结果排除全部为空的列的要求,则可以使用UNPIVOT and then a PIVOT执行此操作。