如下图 , 左边是原始数据,右边是想要的结果。
可以确定的是XMDD如果大于3位,一定可以用英文逗号分隔。

关注引自免费微信小程序:皆我百晓生
为了解决这个问题,我们可以使用SQL语句来处理。首先,我们假设原始数据存储在一个表中,表名为original_data,包含两列:VNAME(姓名)和XMDD(编码)。目标是将XMDD中的逗号分隔的值拆分为多行。以下是实现这一目标的SQL查询:
-- 创建一个临时表来存储拆分后的结果
CREATE TEMPORARY TABLE IF NOT EXISTS split_data AS
SELECT VNAME,
SUBSTRING_INDEX(SUBSTRING_INDEX(XMDD, ',', numbers.n), ',', -1) AS XMDD
FROM original_data
CROSS JOIN (
SELECT a.N + b.N * 10 + 1 n
FROM (
SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) a
CROSS JOIN (
SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) b
ORDER BY n
) numbers
WHERE XMDD REGEXP ','
OR XMDD RLIKE '^[^,]+$'
ORDER BY VNAME, n;
这个查询首先创建了一个数字序列(从1到100),然后通过CROSS JOIN与原始数据表连接,使用SUBSTRING_INDEX函数来拆分XMDD字段中的值。REGEXP和RLIKE用于检查XMDD是否包含逗号或是否是一个非逗号分割的字符串。
然而,上述SQL语句可能在某些数据库系统中不适用,因为它依赖于特定的SQL方言。对于MySQL,上述代码应该可以正常工作。对于其他数据库系统,例如PostgreSQL或SQL Server,你可能需要调整生成数字序列的方法以及字符串函数的使用。
如果你的数据中XMDD字段总是包含逗号分隔的列表,你可以简化查询,去除正则表达式的部分:
CREATE TEMPORARY TABLE IF NOT EXISTS split_data AS
SELECT VNAME,
SUBSTRING_INDEX(SUBSTRING_INDEX(XMDD, ',', numbers.n), ',', -1) AS XMDD
FROM original_data
CROSS JOIN (
-- 数字序列生成,根据实际需要调整范围
SELECT ROW_NUMBER() OVER () as n FROM (SELECT 1 UNION ALL SELECT 1 UNION ... UNION ALL SELECT 1) t(n)
) numbers
WHERE XMDD LIKE '%,%'
ORDER BY VNAME, n;
在这个版本中,我们假设XMDD字段总是包含至少一个逗号。如果XMDD字段可能不包含逗号,且你希望保留这些记录,你需要在查询中添加额外的逻辑来处理这种情况。
最后,确保在执行完查询后清理临时表,除非你打算保留它以供后续分析使用。这可以通过简单的DROP TABLE split_data;命令完成。
请根据你的具体数据库环境和需求调整上述SQL语句。如果需要进一步的帮助,例如针对特定数据库系统的优化,或者在执行过程中遇到任何问题,请随时告知。