mysql中循环截取用户信息,插入到目标表中

本文介绍了一种使用存储过程将用户游戏分数更新并插入到数据库表中的方法,包括创建临时表、解析输入参数和更新目标表的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作环境:有表game_list,字段:uid,score1,score2,seat_id,last_update;
 传入参数为i_player_detail ,传入的值为多个用户的id、之前分数、之后分数、座位号,每个用户的数据用分号(;)隔开;
操作目的:将各个用户对应的属性插入到目标表对应的字段中,last_update为数据更新日期;
 传入参数i_player_detail ,里面存放多个用户的信息,每个用户的一组数据用分号隔开,每个用户的信息多个,比如
“用户id,score,desk,seat;
  用户id,score,desk,seat;……”

-- 使用存储过程
delimiter 

use `log_pdk` 


drop procedure if exists `game_c` 


create procedure `game_c` (in i_player_detail varchar(500))

SQL SECURITY INVOKER
BEGIN

DROP TABLE IF EXISTS `temp_list`;


    --创建临时表,将截取的数据先插入到临时表
    CREATE TEMPORARY TABLE `temp_list`(
        `uid` INT(10) UNSIGNED NOT NULL,
        `score1` INT(10) UNSIGNED NOT NULL,
        `score2` INT(10) UNSIGNED NOT NULL,
        `seat_id` TINYINT(3) UNSIGNED NOT NULL
    );

-- declare str varchar(500);-- 用来拼接sql动态语句
declare m_detail varchar(500);
declare m_num tinyint;

-- 当传入的用户信息字符串中含有分号';',进行截取
set m_num = position(';' in str) -- 不存在分号的时候,返回0
while m_num >= 1 do
begin
   set @str = 'insert into temp_list values (' + substring(m_detail,1,m_num-1)+')' -- 截取第一个用户的信息(第一个分号前面的字符),插入到临时表
prepare statement1 from @str;
execute statement1;
deallocate prepare statement1;
set m_detail = substring(m_detail,m_num+1); -- 定义除去第一个用户和分号那部分的字符串
set set m_num = position(';' in str);
end while;

-- 从临时表抽出所有字段,添加时间字段,插入到表game_list
INSERT INTO `game_list`(`uid`,`score1`,`score2`,`seat_id`, `last_update`)
                     SELECT `uid`, `score1`, `score2`, `seat_id`, current_date() 
FROM `temp_list`;
 
end

delimiter ;


<think>嗯,用户的问题是想在PostgreSQL中把查询结果中的某个字段裁剪后插入到另一张表里。我需要先理清楚怎么做这个操作。首先,用户提到的是使用trim函数,trim是用来去除字符串两端的空格的,但可能用户也指更一般的字符串处理,比如截取部分内容。 那PostgreSQL里常用的字符串函数有哪些呢?比如substring或者left/right这些函数。我需要确认用户是要去除空格还是截取特定位置的字符。假设用户是想去掉字段两边的空格然后插入另一个表,那基本的语法应该是INSERT INTO ... SELECT ...,结合TRIM函数。 然后,用户可能不太清楚具体的SQL语句结构。我应该分步骤说明,先讲基本的INSERT INTO SELECT结构,再添加TRIM函数的用法。比如: INSERT INTO target_table (column1, trimmed_column) SELECT column1, TRIM(source_column) FROM source_table; 这样就能把source_table里的source_column去掉空格后插入到target_table的trimmed_column里。 另外,可能需要处理多个字段或者更复杂的裁剪情况,比如用SUBSTRING或者正则表达式。例如,SUBSTRING(column FROM 1 FOR 5)来截取前五个字符。或者用正则表达式函数regexp_replace来替换不需要的部分。 还要考虑目标表的结构是否匹配,比如字段数量和类型是否一致。如果目标表有更多的列,可能需要指定列名,或者处理默认。如果用户没有提到表结构,可能需要提醒他们检查表结构是否兼容,避免插入错误。 还有引用的问题,用户提供的引用中有提到Hive和Parquet的区别,但这个问题是关于PostgreSQL的,所以可能不需要涉及这些引用。但引用1里有一个MySQL的例子,用户可能误用了,不过不影响,可能不需要参考这些。 另外,用户可能想了解如何同时处理多个字段,或者如何在插入时进行更复杂的转换,比如大小写转换或者其他字符串操作。所以补充其他字符串函数可能会有帮助,比如LOWER、UPPER、REPLACE等。 总结下来,回答应该包括基本语法示例,使用TRIM函数,其他字符串函数的例子,注意事项比如字段匹配和事务处理,以及相关问题的建议。这样用户就能根据具体情况调整SQL语句,完成需求。</think>### 分步解决方案 1. **基本语法结构** 使用 `INSERT INTO ... SELECT` 结合字符串函数 `TRIM` 实现裁剪字段并插入。 ```sql INSERT INTO target_table (target_column1, target_column2) SELECT source_column1, TRIM(source_column2) -- TRIM去除首尾空格 FROM source_table; ``` 2. **扩展字符串处理** - **截取子字符串**:用 `SUBSTRING` 或 `LEFT/RIGHT` ```sql -- 截取前5个字符 INSERT INTO target_table (trimmed_field) SELECT SUBSTRING(source_field FROM 1 FOR 5) FROM source_table; ``` - **正则表达式裁剪**:用 `REGEXP_REPLACE` ```sql -- 移除所有数字 INSERT INTO target_table (cleaned_field) SELECT REGEXP_REPLACE(source_field, '\d', '', 'g') FROM source_table; ``` 3. **复杂条件处理** 添加 `WHERE` 过滤或 `CASE` 条件: ```sql INSERT INTO target_table (status) SELECT CASE WHEN LENGTH(TRIM(source_field)) > 10 THEN 'VALID' ELSE 'INVALID' END FROM source_table; ``` 4. **跨表字段映射** 确保目标表与查询结果的字段类型和数量匹配,例如: ```sql -- 源表含employee_id, remarks字段 INSERT INTO employee_summary (id, cleaned_remarks) SELECT employee_id, TRIM(REGEXP_REPLACE(remarks, '[#@&]', '', 'g')) FROM employees; ``` 5. **事务与性能优化** - 大表操作时建议分批提交(添加 `LIMIT` 和循环) - 使用 `BEGIN; ... COMMIT;` 包裹语句保证原子性 ### 注意事项 - 字符串函数需与字段类型兼容(如非文本字段需显式转换) - 目标表的约束(如唯一索引)可能引发插入失败 - 可通过 `EXPLAIN ANALYZE` 分析执行计划优化性能[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值