oracle如何把一行拆分为多行?

啊?请您提一下,我以前在项目中也遇到过类似的情况。
当时,我们正在拆分日志文件的字段,使用正则表达式实际上是一个好主意。

要在 Oracle 中执行此操作,实际上需要使用 CONNECT BY。
你给出的想法是正确的,但是你要注意正则表达式的写法。
Oracle的主要常用函数是REGEXP_SUBSTR,它是最容易使用的。

例如,在 TEST_TABLE 中,DATA_COLUMN 存储“apples、bananas、cherries”等字符串。
如果你想将其拆分为每行一个结果,可以这样写:
sql SELECT REGEXP_SUBSTR(DATA_COLUMN, '[^,]+', 1 , LEVEL) 作为项目 来自测试表 CONNECT BY REGEXP_SUBSTR(DATA_COLUMN, '[^,]+', 1 , LEVEL) 不为空 AND SYS_GUID BEFORE () 之前不为空 AND 数据 PREVIOUS_COLUMN = DATA_COLUMN
这里的关键点是: 1 、REGEXP_SUBSTR函数,第一个参数是字符串,第二个参数是正则表达式,第三个参数是起始位置,第四个参数是当前级别(LEVEL) 2 .正则表达式'[^,]+'表示匹配任意一个或多个非逗号的字符 3 . CONNECT BY 条件中需要 PREVIOUS,但具体值可以随意写,只要同一行的数据能够相互关联即可
如果您使用的是 Oracle 1 2 c 或更高版本,并且想要删除更复杂的分隔符组合,例如逗号后面可能有空格,可以使用:
sql SELECT REGEXP_SUBSTR(DATA_COLUMN, '[^,]+', 1 , LEVEL) 作为项目 来自测试表 CONNECT BY REGEXP_SUBSTR(DATA_COLUMN, '[^,]+', 1 , LEVEL) 不为空 AND SYS_GUID BEFORE () 之前不为空 AND 数据 PREVIOUS_COLUMN = DATA_COLUMN
这个正则'[^,]+'可以匹配逗号之前的所有字符,包括空格。
如果分隔符比较复杂,比如'|'但前面可能有空格,可以改为常规的“\s|”
但要注意性能问题。
当数据量很大时,这种拆分操作会很慢。
我处理几百条数据没有问题,但是有一个子项目拆分几万条数据卡了很久。
最后,我转向使用 PL/SQL 程序来处理它。

你可以尝试一下这种写法。
如果分隔符比较复杂,可以调整正则表达式。

SQL server根据逗号拆分字符串

说白了,分割字符串是SQL中常见的操作,尤其是遇到逗号分隔的参数时。
其实很简单。
这里主要介绍三种方法,但首先要说一下为什么会出现这个问题。
我们去年跑的项目,数据量大概有3 000条左右。
由于数据范围问题,使用前三种方法遇到了瓶颈。

我们先来说说最重要的事情。
第一种方法使用spt_values,可以获取master..spt_values中0-2 04 7 的数字,这样就可以找到逗号的位置。
还有一点,第二种方法是通过计算字符串的长度和替换逗号后的长度来间接确定逗号的位置。
还有一个很关键的细节,就是第四种方法,通过创建临时表来扩大内存使用量,以处理更大范围的数据。

一开始我以为第四种方法是最优解,后来发现是错误的。
虽然可以处理更多的数据,但是效率不是很高。
等等,还有一点是,CONCAT函数是在SQL Server 2 01 2 之后添加的,所以如果你的环境是2 008 或者2 01 4 ,使用这个函数是没有问题的,但是要注意官方环境可能不会。

最后提醒一下,分割字符串时要注意内存和处理效率问题。
如果遇到数据量较大的情况,第四种方法虽然可以解决问题,但可能不是最高效的选择。
我认为值得尝试使该方法适应实际数据量,或者寻找其他可能的解决方案。

MySQL 中将使用逗号分隔的字段转换为多行数据

直接使用SQL来分隔逗号字段数据。

bus_mark_info表的page字段是逗号分隔的,需要分隔到bus_pages表中。

SQL使用help_topic表来生成临时相关数据。

关联条件:help_topic_id < (length(page)
length(REPLACE(page, ',', '')) + 1 )
使用SUBSTRING_INDEX遍历各个页面:
SUBSTRING_INDEX(page, ',', help_topic_id + 2 )
例如第1 页,第
页。

help_topic表需要一个从0开始的连续ID,且数量足够。

最多支持 7 01 页。
如果超出限制,则需要更改时间表。

SQL 示例:
sql 插入总线页面(页面内容) SELECT SUBSTRING_INDEX(T1 .pages, ',', T2 .help_topic_id + 1 ) 从总线标记信息 T1 JOIN help_topic T2 ON T2 .help_topic_id < (LENGTH(T1 .pages)
LENGTH(REPLACE(T1 .pages, ',', '')) + 1 )
称一下体重。