4

有很多关于将行转换为各种数据库的列的帖子。它们似乎分为两个阵营,使用案例语句或使用数据库供应商的内置功能。我正在使用MySQL,到目前为止,还没有在任何内置函数上找到任何东西,这些函数可以让我以任意未知数量的行值为中心,我想将它们转换为列。如果我不提前知道这些值,我就无法构建在 stackoverflow 上经常出现的 CASE 查询。我想知道 MySQL 中是否有类似于其他数据库中的东西,它被称为交叉表或数据透视表:

-Postgresql: http
://www.postgresql.org/docs/current/static/tablefunc.html -Oracle:http : //www.oracle-base.com/articles/11g/PivotAndUnpivotOperators_11gR1.php
-SQL Server: http: //msdn.microsoft.com/en-us/library/ms177410.aspx

只是为了确保我在说将行转为列时清楚我的要求,我想像这样转换一个表

user_id 键值
bob 头发 棕色
bob 眼睛 蓝色
jake 头发 brown
jake 身高 6'2"

进入这个:

user_id 头发 眼睛 身高
bob brown blue        
jake brown 6'2"

我正在专门寻找MySQL中的解决方案,因此,如果有任何特定于数据库的新的或出现的您知道的可以解决此问题的东西,将不胜感激。

4

1 回答 1

2

如果您事先知道列名,Kangkan 提供的链接将向您展示如何完成此操作。我们将采用相同的逻辑,除了使用动态 SQL 来构建语句。您需要包含的每个字段有 2 个部分,选择语句中的字段和用于获取值的适当连接...所以我们需要将语句构建为两部分

首先声明 3 个变量来构建它...我将使用 @select、@join 和 @sql 作为这个示例。给变量初始值

 set @select = 'select user_id,'
 set @join = 'from table t'

现在声明并加载具有 table.key 字段中不同值的游标。我将使用@field 作为变量填充不同的 table.key 字段。然后遍历它构建两个变量:

 set @select = @select + ', ' + @field + '.value as '+@field+'
 set @join = @join + ' left join table ' + @field + 'on '+@field+'.key = t.key and and '+@field+'.user_id = t.user_id

(连接被设计为使用@field 中的值作为表的别名)

循环遍历您的光标,构建出@select 和@join。在循环结束时:

set @sql = @select + @join + 'where clause if you want'
exec @sql

像这样构建的动态 SQL 对排除故障(并正确处理)和打开安全问题来说绝对是一件痛苦的事……但这是我可以看到它完成的唯一方法。注意变量的大小限制……如果那里有太多不同的键,变量就会变得太大。抱歉,我不能更准确地使用伪...你会发现在 sql 中构建动态 sql 是很辛苦的。

于 2010-12-23T22:56:05.367 回答