2011-12-23 75 views
3

我有以下表:连接列并在列中包含空值时不包括列?

ApprovalOrder EntityCode ProjectCode

1 1415 NULL

2 1415 NULL

3 1415 NULL

和以下的代码:

select 
     de.ApprovalOrder + de. EntityCode + isnull(de.ProjectCode, '') as 'RowID' 
    from workflow.delegation_engine de 
    where EntityCode = 1415 and DelegationCode = 'CAT1' 

这不幸的是返回一个附加结果。我知道这是它应该做的,但是我怎样才能让它将每列的结果连接成一个结果,同时当结果不是NULL时也只包括de.ProjectCode(这可以是字符或整数值) 。

例如,如果我刚刚在此表的第一行上运行查询,我希望返回的结果为'11415'。

回答

4

要明确你在做什么,我会投每个项目首先到VARCHAR()。

CAST(de.ApprovalOrder AS VARCHAR(16)) + CAST(de.EntityCode AS VARHCAR(16)) + ISNULL(CAST(de.ProjectCode AS VARCHAR(16)), '') 


如果你想有一个黑客避开显式转换,开始用绳子推导...

'' + de.ApprovalOrder + de.EntityCode + ISNULL(de.ProjectCode, '') 
+2

隐式投射示例+1 – 2011-12-23 01:54:19

+2

@Lieven:+1为+1;) – MatBailie 2011-12-23 01:55:01

+0

喜欢明确的铸造示例 - 值得在将来值得注意。 – Codingo 2011-12-23 02:01:21

4

您正在添加两个整数值而不是连接两个字符串。在连接它们之前,您应该先将CAST这些INTEGER类型转换为VARCHAR

SELECT CAST(de.ApprovalOrder AS VARCHAR(32)) 
     + CAST(de.EntityCode AS VARCHAR(32)) 
     + ISNULL(CAST(de.ProjectCode AS VARCHAR(32)), '') as 'RowID' 
FROM workflow.delegation_engine de 
WHERE EntityCode = 1415 
     AND DelegationCode = 'CAT1' 

请注意,我假设32至极的字符串长度大于足以容纳任何INTEGER转换的更多(10应该足够了)

+0

+1的比我快:) – MatBailie 2011-12-23 01:51:56

+0

@Dems - thx,但它似乎是微不足道的。 – 2011-12-23 01:55:52

+0

但有趣,在“我应该在床上”种方式:) – MatBailie 2011-12-23 01:58:42