代码之家  ›  专栏  ›  技术社区  ›  Scott

在MySQL中有没有一种不用CASE就可以将行转换成列的方法?

  •  4
  • Scott  · 技术社区  · 15 年前

    MySQL数据库 到目前为止,还没有在任何内置函数上找到任何东西,这些函数将允许我在要透视到列的任意未知行值数上进行透视。如果我不提前知道这些值,就无法构建在stackoverflow上频繁出现的CASE查询。我想知道MySQL中是否有类似于其他数据库的东西,在这些数据库中,它被称为crosstab或pivot:

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

    为了确保我清楚地知道当我说pivot rows to columns时我要求的是什么,我想这样转换一个表


    波拜布朗
    眼蓝

    满意的

    进入这个:

    用户头发眼睛高度
    鲍勃朗
    杰克布朗

    我正在寻找一个特别的解决方案 MySQL数据库 ,因此,如果有任何数据库特定的是新的或即将推出的,你知道,可以解决这个问题,将非常感谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Lightness Races in Orbit    11 年前

    Kangkan提供的链接将向您展示如果您事先知道列名,如何实现这一点。我们使用相同的逻辑,除了使用动态SQL构建语句。每个字段有两部分需要包含,select语句中的字段和获取值的适当连接…所以我们需要将语句分为两部分

    首先声明3个变量来构建这个……对于这个例子,我将使用@select、@join和@sql。给变量初始值

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

     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中的值作为表的别名)

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

    像这样构建的动态SQL对于解决(和纠正)问题和打开安全问题来说绝对是一件痛苦的事情……但这是我看到这一点的唯一方法。注意变量的大小限制…如果有太多不同的键,变量会变得太大。很抱歉,我不能更精确地使用伪语句…您会发现在sql中构建动态sql是非常困难的。

    推荐文章