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 输出
解释:
首先通过内部查询,即
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'
总是尝试像这样分解查询,您将能够以更简单的方式理解查询。
我在 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 输出
解释: 首先通过内部查询,即
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'
总是尝试像这样分解查询,您将能够以更简单的方式理解查询。