执行UNION时如何避免添加多个NULL值?

时间:2013-12-26 12:56:20

标签: sql sql-server-2005 null union

我需要将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值编写整个查询。正如您所注意到的,我需要第1,第3和第3和第4列的值。这可能因报告而异。列顺序也可以不同,但​​我确实需要一些随机的NULL值,我不关心任何值。

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

任何想法都将受到赞赏。

谢谢

2 个答案:

答案 0 :(得分:0)

是。这是可能的。有点。但是除非你有很多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

答案 1 :(得分:0)

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

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