MySQL - 如何选择一列以使结果成为树结构?

标签 mysql select split tree

如果我有一个给定的列,其中包含以下快照

"A - B - 1"
"A - B - 2"
"A - C - 1"
"A - C - 2"
"X - B - 1"
"X - B - 2"
"X - C - 1"
"X - C - 2"

我应该运行哪个选择才能得到结果

"A",  "", ""
"", "B", ""
"",  "", "1"
"",  "", "2"
"", "C", ""
"",  "", "1"
"",  "", "2"
"X",  "", ""
"", "B", ""
"",  "", "1"
"",  "", "2"
"", "C", ""
"",  "", "1"
"",  "", "2"

可能吗?

最佳答案

假设字符串中每个字符的位置是固定的,您可以使用字符串函数轻松完成此操作。

select col1, col2, col3
from (  
  select distinct 
    substring(col1,1,1) col1, 
    null col2, 
    null col3, 
    substring(col1,1,1) ord 
  from t

  union all

  select distinct 
    null, 
    substring(col1,5,1), 
    null, 
    concat(substring(col1,1,1),substring(col1,5,1))
  from t

  union all

  select distinct 
    null, 
    null, 
    substring(col1,9,1),
    concat(substring(col1,1,1),substring(col1,5,1),substring(col1,9,1))
  from t  
) a order by ord;

Sample SQL Fiddle

此查询将返回:

|   col1 |   col2 |   col3 |
|--------|--------|--------|
|      A | (null) | (null) |
| (null) |      B | (null) |
| (null) | (null) |      1 |
| (null) | (null) |      2 |
| (null) |      C | (null) |
| (null) | (null) |      1 |
| (null) | (null) |      2 |
|      X | (null) | (null) |
| (null) |      B | (null) |
| (null) | (null) |      1 |
| (null) | (null) |      2 |
| (null) |      C | (null) |
| (null) | (null) |      1 |
| (null) | (null) |      2 |

更新

如果您有固定长度的字符串,上面提供的答案是有效的 - 所有示例都考虑长度等于 1 的字符串。但是,如果您需要可变长度字符串,请按以下步骤操作

SELECT col1, col2, col3
FROM (
  SELECT DISTINCT
    SUBSTRING_INDEX(col1, ' - ', 1) col1, 
    NULL col2, 
    NULL col3, 
    SUBSTRING_INDEX(col1, ' - ', 1) ord
  FROM t

  UNION ALL

  SELECT DISTINCT 
    NULL, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ' - ', 2), ' - ', -1), 
    NULL, 
    CONCAT(SUBSTRING_INDEX(col1, ' - ', 1), SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ' - ', 2), ' - ', -1)) ord
  FROM t

  UNION ALL

  SELECT DISTINCT
    NULL, 
    NULL,  
    SUBSTRING_INDEX(col1, ' - ', -1),
    CONCAT(SUBSTRING_INDEX(col1, ' - ', 1), SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ' - ', 2), ' - ', -1), SUBSTRING_INDEX(col1, ' - ', -1)) ord
  FROM t
) a ORDER BY ord;

关于MySQL - 如何选择一列以使结果成为树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32280380/

相关文章:

python - 使用 win32com 或 xlrd 的 Excel 数据库或 mysql 中的数据库

javascript - 在表单中绑定(bind)两个选择元素的最佳方法?

mysql - 使用 DISTINCT 时发生了什么?

sql - 我想逐行显示字符串

c# - 按长度拆分字符串

java - 在 Java 中将单词拆分为字母

php 警告 - 为 foreach() 提供的参数无效

mysql - 在 MySql 中将 varchar 列值转换为整数

mysql - WHERE 子句中的多个 OR 条件

text - powerquery 按可变字段长度拆分列