【问题标题】:How to avoid adding multiple NULL values when performing UNION?执行 UNION 时如何避免添加多个 NULL 值?
【发布时间】:2014-01-14 03:14:40
【问题描述】:

我需要将 sql 查询结果与另外两条记录结合起来。我需要很少的列值,但其余的可以为 NULL。 表格中的列超过二十五个。现在我可以像这样手动添加了。

--For e.g. Consider this query

SELECT (....)

UNION

SELECT '2',NULL,'418G',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0',NULL,NULL

UNION

SELECT '3',NULL,'710h',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0',NULL,NULL

如果我只加入具有如下值的所需列,则会出现错误。

UNION
SELECT '2' as Category,'418G' as Col3,'0' as Col9,'0' as Col12
UNION
SELECT '3' as Category,'701G' as Col3,'0' as Col9, '0' as Col12

Error: 
Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an 
equal number of expressions in their target lists.

我的问题是,

有没有办法通过任何简单的方式添加这些 NULL 值,而不是用这些 NULL 值编写整个查询。正如您所注意到的,我需要最后一列、第三列、第三列和第四列的值。这可能因报告而异。列顺序也可以不同,但​​可以肯定的是我需要一些随机的 NULL 值,我不关心任何值。

第一部分的主要 SELECT 查询是 INNER JOIN 的 2 个表的结果,然后我想用 NULL 添加这些值。

任何想法都会受到赞赏。

谢谢

【问题讨论】:

  • 这应该重新标记为 SQL 问题,因为它与 SSRS 没有任何关系。
  • 不,这是不可能的。好问题。
  • 用户,感谢您的回复。我知道 UNION 中的每个 SELECT 语句必须具有相同数量的列。这些列还必须具有相似的数据类型。此外,每个 SELECT 语句中的列必须具有相同的顺序,但是对于这种情况,应该有一些魔法可以忽略这些值,直到我们找到要添加的非空值。让我们看看任何最佳答案。

标签: sql sql-server-2005 null union


【解决方案1】:

虽然这并不能完全避免该问题,但您可以确保您只需使用子选择键入一次 NULLs:

SELECT (....)
UNION
SELECT Category,NULL,Col3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,Col9,Col12,NULL,NULL
FROM (
  SELECT '2' as Category,'418G' as Col3,'0' as Col9,'0' as Col12
  UNION
  SELECT '3' as Category,'701G' as Col3,'0' as Col9,'0' as Col12
) AS sub

【讨论】:

    【解决方案2】:

    是的。这是可能的。有点。但除非你有很多 UNION,否则你最终可能会编写更多代码。

    定义一个与输出匹配的表变量。将您的静态数据插入其中并与之合并。

    比如……

    declare @static table (
        c1 nvarchar(max),
        c2 nvarchar(max),
        c3 nvarchar(max),
        c4 nvarchar(max),
        c5 nvarchar(max),
        c6 nvarchar(max),
        c7 nvarchar(max),
        c8 nvarchar(max),
        c9 nvarchar(max),
        c10 nvarchar(max),
        c11 nvarchar(max),
        c12 nvarchar(max),
        c13 nvarchar(max),
        c14 nvarchar(max),
        c15 nvarchar(max),
        c16 nvarchar(max),
        c17 nvarchar(max),
        c18 nvarchar(max),
        c19 nvarchar(max),
        c20 nvarchar(max),
        c21 nvarchar(max),
        c22 nvarchar(max),
        c23 nvarchar(max),
        c24 nvarchar(max),
        c25 nvarchar(max),
        c26 nvarchar(max),
        c27 nvarchar(max),
        c28 nvarchar(max),
        c29 nvarchar(max),
        c30 nvarchar(max),
        c31 nvarchar(max),
        c32 nvarchar(max),
        c33 nvarchar(max),
        c34 nvarchar(max),
        c35 nvarchar(max),
        c36 nvarchar(max),
        c37 nvarchar(max),
        c38 nvarchar(max),
        c39 nvarchar(max),
        c40 nvarchar(max),
        c41 nvarchar(max),
        c42 nvarchar(max),
        c43 nvarchar(max),
        c44 nvarchar(max),
        c45 nvarchar(max),
        c46 nvarchar(max),
        c47 nvarchar(max),
        c48 nvarchar(max),
        c49 nvarchar(max),
        c40 nvarchar(max),
        c51 nvarchar(max),
        c52 nvarchar(max),
        c53 nvarchar(max),
        c54 nvarchar(max),
        c55 nvarchar(max),
        c56 nvarchar(max),
        c57 nvarchar(max),
        c58 nvarchar(max),
        c59 nvarchar(max),
        c60 nvarchar(max),
        c61 nvarchar(max),
        c62 nvarchar(max)
    )
    
    insert @static (c1, c3, c59, c60) values ('1','418G','0','0')
    insert @static (c1, c3, c59, c60) values ('2','710G','0','0')
    
    select [...]
    union
    select * from @static
    

    【讨论】:

    • 感谢 JC,但我认为这样我必须编写比普通查询更多的编码,因为我只需将三个记录与 UNION 语句结合起来。
    猜你喜欢
    • 2021-10-10
    • 2011-08-05
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2020-09-23
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多