sql记录 拆分逗号

sql 复制代码
JOIN numbers ON CHAR_LENGTH(table.number) - CHAR_LENGTH(REPLACE(table.number, ',', '')) >= numbers.n - 1
sql 复制代码
CREATE TABLE numbers (n INT PRIMARY KEY);
INSERT INTO numbers VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

这段 SQL 代码的作用是通过 `JOIN` 操作将表 `table` 和 `numbers` 进行关联,其核心逻辑是基于 `table.number` 字段中逗号(`,`)的数量来匹配 `numbers` 表中的数值

代码解析:

1. `CHAR_LENGTH(table.number)`

计算 `table.number` 字段的字符长度。

2. `REPLACE(table.number, ',', '')`

将 `table.number` 中的所有逗号(`,`)替换为空字符串,即移除所有逗号。

3. `CHAR_LENGTH(table.number) - CHAR_LENGTH(REPLACE(table.number, ',', ''))`

通过计算原始字符串长度与去除逗号后字符串长度的差值,得到 `table.number` 中逗号的数量。

4. `>= numbers.n - 1`

将上述逗号数量与 `numbers.n - 1` 进行比较。这里假设 `numbers` 是一个包含连续整数的辅助表(例如 1, 2, 3, ...),[n](file://C:\project\cangchuV2\spmms-hd\ruoyi-ui\package.json) 表示当前行的数值。

5. `JOIN numbers`

通过上述条件将 `table` 表与 `numbers` 表进行连接,实现按逗号数量展开数据的效果。

应用场景说明:

这种写法通常用于"拆分逗号分隔的字符串"并将其转换为多行数据。

例如:

示例数据:

  • `table.number = 'A,B,C'`

  • `numbers` 表包含数值:1, 2, 3

处理逻辑:

  1. `table.number` 中有 2 个逗号。

  2. 条件 `CHAR_LENGTH(table.number) - CHAR_LENGTH(REPLACE(table.number, ',', '')) >= numbers.n - 1` 成立的情况:

  • 当 `numbers.n = 1` 时,`0 >= 0`(成立)

  • 当 `numbers.n = 2` 时,`1 >= 1`(成立)

  • 当 `numbers.n = 3` 时,`2 >= 2`(成立)

因此,`table.number = 'A,B,C'` 会被展开为 3 行,每行对应一个逗号分隔的部分。

注意事项:

1. 性能问题

如果 `table.number` 数据量较大或逗号数量较多,此方法可能导致性能下降,因为每次都需要计算字符串长度和替换操作。

2. `numbers` 表的设计

需要确保 `numbers` 表中包含足够大的连续整数,以覆盖最大可能的逗号数量。

3. 替代方案

在支持 JSON 或数组类型的数据库(如 PostgreSQL)中,可以使用内置函数(如 `unnest()` 或 `string_to_array()`)更高效地处理类似需求。

相关推荐
Polar__Star4 分钟前
Golang bcrypt如何加密密码_Golang密码加密教程【收藏】
jvm·数据库·python
澄澈青空~25 分钟前
有一个叫R2C,也有一个叫G2C
java·数据库·人工智能·c#
weixin_5860614627 分钟前
如何用 event.composedPath 获取事件触发经过的所有节点
jvm·数据库·python
SuperHeroWu730 分钟前
【鸿蒙基础入门】概念理解和学习方法论说明
前端·学习·华为·开源·harmonyos·鸿蒙·移动端
weixin_4087177738 分钟前
如何用 Iterator.from 将类数组转化为具备现代方法的迭代器
jvm·数据库·python
努力努力再努力wz39 分钟前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
Full Stack Developme39 分钟前
MyBatis-Plus 流式查询教程
前端·python·mybatis
深念Y43 分钟前
图数据库 vs 向量数据库:AI时代的两个“最强大脑”
数据库·人工智能·neo4j·图论··向量·rag
2301_782659181 小时前
SQL视图能否用于数据仓库模型_雪花模型与视图构建
jvm·数据库·python
m0_377618231 小时前
CSS如何让文字超出两行显示省略号_使用line-clamp属性限制
jvm·数据库·python