string split function in postgreSQL 17.01 or SQL Server2019 or mySQL 9.0 or Oracel 21c
postgreSQL 17.01 +
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT 'S0001' AS STU, unnest(string_to_array( 'G,E,O,V,I,N,D,U,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' , ',' )) AS parts; delete from Answer where AnswerSudentId= 'S0001' ; drop table IF EXISTS TempSubString; CREATE TABLE TempSubString( id SERIAL, studentid varchar (5), subname VARCHAR (150), PRIMARY KEY (id) ); insert into TempSubString(studentid,subname) SELECT 'S0001' AS STU,unnest(string_to_array( 'A,,B,C,D,A,B,D,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' , ',' )) AS parts; -- 每题的得分 考虑,是否存在记录,存在删除,不存在,直接添加 Geovin Du -- delete from Answer where AnswerSudentId=@studentid; insert into Answer(AnswerSudentId,AnswerQuestionId,AnswerStudentResult,AnswerScore) select studentid,id,subname,f_GetAnswerScore(id,subname) as score from TempSubString ; SELECT * FROM Answer; |
sql server 2019:
1 2 3 4 5 6 7 8 | declare @studentid char (5),@result nvarchar(2000) set @studentid=@StudentGradeId; -- 学生编号 set @result=@resultAwsert; insert into #TempSubString(studentid,subname) SELECT @studentid,[value] FROM STRING_SPLIT(@result, ',' ); -- 每题的得分 考虑,是否存在记录,存在删除,不存在,直接添加 -- delete from Answer where AnswerSudentId=@studentid; insert into Answer(AnswerSudentId,AnswerQuestionId,AnswerStudentResult,AnswerScore) select studentid,id,subname,dbo.f_GetAnswerScore(id,subname) as score from #TempSubString ; |
1 2 3 4 5 | -- 测试结果 DECLARE @studentid CHAR (5),@result NVARCHAR(1000) set @studentid= 'S0001' ; -- 学生编号 set @result= 'A,C,D,B,A,D,C,B,C,D,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,C' ; EXEC procImportStudentGrade @studentid,@result; |
mysql 9.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | set @studentid= 'S0001' ; #学生编号 set @result= 'A,,B,C,D,A,B,D,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' ; insert into temptable(studentid,subname) SELECT @studentid,SUBSTRING_INDEX(SUBSTRING_INDEX(@result, ',' ,help_topic_id+1), ',' ,-1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH(@result)-LENGTH( REPLACE (@result, ',' , '' ))+1; SELECT SUBSTRING_INDEX( 'A,,B,C,D' , ',' ,1); SELECT SUBSTRING_INDEX( 'A,,B,C,D' , ',' ,2); SELECT SUBSTRING_INDEX( 'A,,B,C,D' , ',' ,-2); SELECT SUBSTRING_INDEX( 'A,,B,C,D' , ',' ,-1); SELECT SUBSTRING_INDEX( 'Ann Smith' , ' ' , 1); SELECT LOCATE( '.' , 'www.dusystem.com' ); set @skills= 'MySQL,PostgreSQL,SQLite' ; SELECT SUBSTRING_INDEX(@skills, ',' , 1) AS skill_1, SUBSTRING_INDEX(SUBSTRING_INDEX(@skills, ',' , 2), ',' , -1) AS skill_2, SUBSTRING_INDEX(SUBSTRING_INDEX(@skills, ',' , 3), ',' , -1) AS skill_3; |
oracle 21c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | DECLARE v_nums VARCHAR2(4000) := 'A,,B,C,D,A,B,D,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' ; v_start NUMBER := 1; v_end NUMBER; v_substr VARCHAR2(4000); BEGIN LOOP v_end := INSTR(v_nums, ',' , v_start); EXIT WHEN v_end = 0; v_substr := SUBSTR(v_nums, v_start, v_end - v_start); DBMS_OUTPUT.PUT_LINE(TRIM( ',' FROM v_substr)); -- 或者将结果插入到表中 v_start := v_end + 1; END LOOP; -- 处理最后一个子字符串(没有逗号的情况) v_substr := SUBSTR(v_nums, v_start); DBMS_OUTPUT.PUT_LINE(TRIM( ',' FROM v_substr)); -- 或者将结果插入到表中 END ; / -- 自定义函数 CREATE OR REPLACE FUNCTION SplitString( p_string IN VARCHAR2, p_delimiter IN VARCHAR2 ) RETURN sys.odcivarchar2list PIPELINED AS l_start_pos PLS_INTEGER := 1; l_end_pos PLS_INTEGER; BEGIN LOOP l_end_pos := INSTR(p_string, p_delimiter, l_start_pos); IF l_end_pos = 0 THEN PIPE ROW(SUBSTR(p_string, l_start_pos)); EXIT; END IF; PIPE ROW(SUBSTR(p_string, l_start_pos, l_end_pos - l_start_pos)); l_start_pos := l_end_pos + 1; END LOOP; RETURN ; END ; / -- 测试 geovindu SELECT column_value AS split_value FROM TABLE (SplitString( 'A,,B,C,D,A,B,D,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' , ',' )); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | CREATE OR REPLACE TYPE SplitStringWithSeqTableType AS TABLE OF SplitStringWithSeqType; / CREATE OR REPLACE FUNCTION SplitStringWithSeq( p_string IN VARCHAR2, p_delimiter IN VARCHAR2 ) RETURN SplitStringWithSeqTableType PIPELINED AS l_start_pos PLS_INTEGER := 1; l_end_pos PLS_INTEGER; l_seq_num PLS_INTEGER := 1; l_str_value VARCHAR2(4000); BEGIN LOOP l_end_pos := INSTR(p_string, p_delimiter, l_start_pos); IF l_end_pos = 0 THEN l_str_value := SUBSTR(p_string, l_start_pos); PIPE ROW(SplitStringWithSeqType(l_seq_num, l_str_value)); EXIT; END IF; l_str_value := SUBSTR(p_string, l_start_pos, l_end_pos - l_start_pos); PIPE ROW(SplitStringWithSeqType(l_seq_num, l_str_value)); l_start_pos := l_end_pos + 1; l_seq_num := l_seq_num + 1; END LOOP; -- 在PIPELINED函数中,不需要RETURN语句,因为PIPE ROW已经处理了返回。 END ; / -- 测试 SELECT * FROM TABLE (SplitStringWithSeq( 'A,,B,C,D,A,B,D,B,,A,B,C,D,A,B,D,B,C,C,B,A,B,D,A,C,D,A,B,D,A,D,C,B,D,B,D,B,A,C,D,A,C,D,A,A,C,B,A,D' , ',' )); |
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2023-11-13 C: Linked List
2022-11-13 CSharp: Bridge Pattern in donet 6
2010-11-13 css 自定义字体 Internet Explorer,Firefox,Opera,Safari