gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:03:05 26 4
gpt4 key购买 nike

我在对数据类型不完全相同的列使用 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

一切都是 unicorn 和彩虹。现在,我将 Lastname 的数据类型更改为 varchar(25),一切都崩溃了。输出为:

The type of column "Lastname" conflicts with the type of other columns specified in the UNPIVOT list.

如何解决这个问题并将所有内容即时转换为 varchar(50),而不篡改表中的实际数据类型?

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

SqlFiddle 损坏示例(不同数据类型):http://sqlfiddle.com/#!3/5dca13/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

关于sql - 使用 unpivot 时如何解决列类型的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com