使用unpivot时如何解决列类型的差异?

 有海的地方最美_171 发布于 2023-02-13 11:26

我在列上使用unpivot时遇到问题,这些数据类型并不完全相同,我无法弄清楚如何动态转换列,因为UNPIVOT的语法似乎不支持它.

考虑这个例子:

DECLARE @People TABLE
(PersonId int, Firstname varchar(50), Lastname varchar(50))
-- Load Sample Data
INSERT INTO @People VALUES (1, 'Abe', 'Albertson')
INSERT INTO @People VALUES (2, 'Benny', 'Boomboom')

SELECT PersonId, ColumnName, Value FROM @People
UNPIVOT
(
  ColumnName FOR 
  Value IN (FirstName, LastName)
) 

结果是这样的:

PersonId    ColumnName        Value
----------- ----------------- ----------------
1           Abe               Firstname
1           Albertson         Lastname
2           Benny             Firstname
2           Boomboom          Lastname

一切都是独角兽和彩虹.现在我将Lastname的数据类型更改为varchar(25),一切都中断了.输出是:

"Lastname"列的类型与UNPIVOT列表中指定的其他列的类型冲突.

我怎样才能解决这个问题并将所有内容转换成动态的varchar(50),而不会篡改桌面上的实际数据类型?

SqlFiddle工作示例(相同数据类型):http://sqlfiddle.com/#!3/f3719

SqlFiddle破解示例(diff数据类型):http://sqlfiddle.com/#!3/5dca13/1

1 个回答
  • 您无法在UNPIVOT语法内转换,但您可以转换子查询中的数据,类似于以下内容:

    select PersonId, ColumnName, Value  
    from
    (
      select personid, 
        firstname, 
        cast(lastname as varchar(50)) lastname
      from People
    ) d
    unpivot
    (
      Value FOR 
      ColumnName in (FirstName, LastName)
    ) unpiv;
    

    请参阅SQL Fiddle with Demo

    另一种方法是使用CROSS APPLY,根据您的SQL Server版本,您可以使用CROSS APPLY与VALUES或UNION ALL:

    select PersonId, ColumnName, Value  
    from People
    cross apply
    (
      select 'firstname', firstname union all
      select 'lastname', cast(lastname as varchar(50))
    ) c (ColumnName, value)
    

    请参阅SQL Fiddle with Demo.

    2023-02-13 11:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有