Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008 R2-合并结果_Sql_Sql Server 2008 R2 - Fatal编程技术网

SQL Server 2008 R2-合并结果

SQL Server 2008 R2-合并结果,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一张非常简单的桌子。它有一个键列和另外4个列,每个列表示不同的数据类型。规则如下: 每行都有一个完整的键值 对于每一行,剩余的4列可能都是空的 或 对于每一行,剩余的4列中只有1列将被填充 我试图实现的是编写一个查询,该查询将只产生两列(键和4中的1)。基本上把4根柱子浓缩成一根 4列的数据类型如下所示: nvarchar(255) numeric(32, 5) datetime nvarchar(MAX) 源数据 ╔═════╦═══════════╦══════╦═══════════

我有一张非常简单的桌子。它有一个键列和另外4个列,每个列表示不同的数据类型。规则如下:

  • 每行都有一个完整的键值
  • 对于每一行,剩余的4列可能都是空的
  • 对于每一行,剩余的4列中只有1列将被填充
  • 我试图实现的是编写一个查询,该查询将只产生两列(键和4中的1)。基本上把4根柱子浓缩成一根

    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 ║
    ╚═════╩════════════════╝
    

    非常感谢您的帮助。

    您可以像这样使用
    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
    。否则,如果我们保证四列中只有一列
    不为空
    ,那么将返回这一列。

    您可以像这样使用
    合并

    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
    ,则将返回此列。

    只有将所有值转换为字符串时,
    coalesce()函数才能工作:

    select id,
           coalesce(col1,
                    cast(col1 as nvarchar(255)),
                    cast(col2 as nvarchar(255)),
                    cast(col3 as nvarchar(255))
                   ) as col
    
    coalesce()
    函数可以工作,但前提是将所有值转换为字符串:

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

    您应该使用isnull

    select key, isnull(col1,col2,col3,col4) as newCol ......
    
    由于数据类型优先级的原因,使用合并有时可能会产生问题。因为COALESCE根据数据类型优先级确定输出的类型

    查看下面的链接了解更多详细信息


    您应该使用isnull

    select key, isnull(col1,col2,col3,col4) as newCol ......
    
    由于数据类型优先级的原因,使用合并有时可能会产生问题。因为COALESCE根据数据类型优先级确定输出的类型

    查看下面的链接了解更多详细信息


    样本数据和期望的结果将非常有用。您希望输出是什么样的?结果集中的列只有一种类型。示例数据和所需结果将非常有用。您希望输出是什么样的?结果集中的列只有一种类型。我相信这个答案将返回类型转换错误。我理解答案,但不理解投票结果。戈登是对的。我已经更正了答案,但他的答案应该是可以接受的。我相信这个答案会返回一个类型转换错误。我理解答案,但不理解投票结果。戈登是对的。我已经更正了答案,但他的答案应该是可以接受的。