MySql : 将列数据转换为行

MySql : Convert Column data to row

我在 mysql 中有一个 table,如下所示。

id  cust_id date    data

1   1   1/1/2018    a b c d e f g

2   1   2/1/2018    h I j k l m n 

在此示例数据列中,大量数据由 space 分隔,如 a b c d,我想在下面的行中显示大小写

id  cust_id date    data

1   1   1/1/2018    a

1   1   1/1/2018    b

1   1   1/1/2018    c

1   1   1/1/2018    d

2   2   2/1/2018    h

2   2   2/1/2018    i

2   2   2/1/2018    j

2   2   2/1/2018    k

我检查了几个选项,比如使用 unpivot 函数,但无法实现我的输出。 提前致谢!!

select
  tablename.id,
  tablename.date
  ,SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.data, ' ', numbers.n), ' ', -1) name
from
  (
    SELECT @row := @row + 1 as n FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
    (SELECT @row:=0) r
  ) numbers INNER JOIN Table1 tablename
  on CHAR_LENGTH(tablename.data)
     -CHAR_LENGTH(REPLACE(tablename.data, ' ', ''))>=numbers.n-1
order by
  id, n

检查 link 输出

http://sqlfiddle.com/#!9/fa0dcb/1

解释: 首先通过内部查询,即

select 0 
union all 
select 1 
union all 
select 3 
union all 
select 4 
union all 
select 5 
union all 
select 6 
union all 
select 6 
union all 
select 7 
union all 
select 8 
union all 
select 9

这将生成包含 10 个数字的 10 行 table。

现在另一个查询:

 SELECT @row := @row + 1 as n FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1

由于上面的查询是从 table 't' 和 table 't1' 下方生成行号的,它们之间用“,”分隔,这意味着它们正在生成笛卡尔积他们的总行数。 例如:t 有 10 行,t1 也有 10 行,所以笛卡尔积产生 100 行。所以@row 变量递增 100 次并给出 100 行 100 个数字从 1 到 100.

下面的查询:

SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.data, ' ', numbers.n), ' ', -1)

这个要 "a b c d e f g h" 一个接一个。

例如: 采取 numbers.n = 1 然后内部 substring_index 将找到第一个 space 的索引,并将 return 字符串放在该索引之前,即 'a' 然后外部 substring_index 将从结果字符串的末尾找到 space 并将给出字符串的最后一个字符,即 'a'.

现在如果你 拿 numbers.n = 2 然后内部 substring_index 将找到第一个 space 的索引,并将 return 字符串放在该索引之前,即 'a b' 然后外部 substring_index 将从结果字符串的末尾找到 space 并将给出字符串的最后一个字符,即 'b'

总是尝试像这样分解查询,您将能够以更简单的方式理解查询。