2017-02-23 88 views
0

我有一个非常简单的表。它有一个关键列和另外4列表示不同的数据类型。规则是这样的:SQL Server 2008 R2 - 组合结果

  1. 每一行都有一个完整的键值
  2. 对于每一行其余4列可能是所有空
  3. 对于每一行仅存的4列1将填充

我想要实现的是写一个查询,这将导致只有两列(键和4的1)。基本上凝结4列ito之一。

的4列的数据类型如下:

nvarchar(255) 
numeric(32, 5) 
datetime 
nvarchar(MAX) 

源数据

╔═════╦═══════════╦══════╦════════════╦════════════════╗ 
║ key ║ col1 ║ col2 ║ col3 ║  col4  ║ 
╠═════╬═══════════╬══════╬════════════╬════════════════╣ 
║ 1 ║ some text ║ null ║ null  ║ null   ║ 
║ 2 ║ null  ║ 5 ║ null  ║ null   ║ 
║ 3 ║ null  ║ null ║ null  ║ null   ║ 
║ 4 ║ null  ║ null ║ 23/02/2017 ║ null   ║ 
║ 5 ║ null  ║ null ║ null  ║ much more text ║ 
╚═════╩═══════════╩══════╩════════════╩════════════════╝ 

理想输出

╔═════╦════════════════╗ 
║ key ║  newCol  ║ 
╠═════╬════════════════╣ 
║ 1 ║ some text  ║ 
║ 2 ║ 5    ║ 
║ 3 ║ null   ║ 
║ 4 ║ 23/02/2017  ║ 
║ 5 ║ much more text ║ 
╚═════╩════════════════╝ 

任何帮助理解。

+1

样本数据和期望的结果真的有帮助。你想要什么样的输出?结果集中的列只有一种类型。 –

回答

1

您可以使用COALESCE这样

select id, coalesce(cast(column1 as nvarchar(255)), cast(column2 as nvarchar(255)), cast(coulmn3 as nvarchar(255)), cast(column4 as nvarchar(255)) 
from ... 

如果他们都是NULL然后NULL将被退回。否则,如果我们保证只有四列中的一列NOT NULL那么这一个将被退回。

+0

我相信这个答案会返回一个类型转换错误。我明白答案,但不是赞扬。 –

+0

戈登是对的。我已经纠正了答案,但他应该是公认的答案。 –

2

coalesce()功能可以正常工作,但只有当你所有的值转换为字符串:

select id, 
     coalesce(col1, 
       cast(col1 as nvarchar(255)), 
       cast(col2 as nvarchar(255)), 
       cast(col3 as nvarchar(255)) 
       ) as col 
0

您应该使用ISNULL

select key, isnull(col1,col2,col3,col4) as newCol ...... 

使用COALESCE有时创建问题由于数据类型优先。由于COALESCE根据数据类型优先级确定输出的类型。

查看下面的链接了解更多详情。

Reference