MySql 替换字段中字符串的sql语句

前言

打代码不耽误我 听歌,看小说,玩游戏。


        //  代表注释,写习惯了,看着舒服,带有//的那一行是我写的理解,请不要搞错了

最终语句,可以自行修改使用     

 
——————————————————————————————————以下sql语句本人只在mysql使用过,其他数据库上是否有效——————————————————————————————————
———————————————————————————————以下皆为本人的见解不确定是否真实,请勿过分相信,动手多练最有用———————————————————————————————
--2022-11-18
//替换字符串的最终语句,根据自已需求修改

UPDATE user set province=(SELECT left(province,2) from (SELECT pass from `user` as user0 where province like '省')as a 
where a.pass=`user`.pass) where id in 
((SELECT id from (SELECT `name` from user where province like '%省')as user1 where user1.name=`user`.`name`))

--2022-11-19
//动态查询并且跨数据库查询表,将查询出来的数据作为数据库名拼接要查询的表名
//我在这个表里添加了dataName字段,里面是与name对应的数据库的名字
————动态sql语句使用链接 https://www.cnblogs.com/mfmdaoyou/p/6704521.html

set @checkUser=concat('SELECT * FROM ',(SELECT dataName FROM web_manage where name='拼多多'),'.user');
prepare stml from @checkUser;
EXECUTE stml;

--2022-11-19
//动态跨数据库查询两张表中同一字段所有相同数据总数
set @checkUser=concat('SELECT province,count(*) FROM (SELECT province FROM ', (SELECT dataName FROM web_manage where name='拼多多'),'.user UNION ALL SELECT province FROM ',
(SELECT dataName FROM web_manage where `name`='QQ音乐'),'.user)t group by province');
prepare stml FROM @checkUser;
EXECUTE stml;

 sql 语句心得

——————————————————————替换字符串的语句,根据自已需求修改——————————————————————————

--因为ECharts里使用地图需要地图省份数据,一直手打数据也不是个办法
--我就去找了个生成数据的工具, datafaker ,这个是github开源项目
--而且数据生成有中文文档,挺好用的 链接 https://github.com/gangly/datafaker

//写这个sql语句是为了删除省份中多余字,比如北京省,天津市,内蒙古自治区
//都要删除,只保留北京、天津、内蒙古

//我使用 mysql数据库 我要实现一个在对应数据库中对多余字符串进行删除的功能
//把这个功能做成通用模板,以后要删除相同多余字符串用这个模板修改就能用了

//那么要截取字段数据我用的是left() ,是从左向右截取用法如下  
// left(要截取的字段,要截取的长度) 用法链接 
// https://blog.youkuaiyun.com/moakun/article/details/82086078

//中途遇到一些错误,比如:数据重复的错误,查出来的数据不能立即修改 
//例如

//查出来的数据不能立即修改的错误语句
UPDATE user set province=(SELECT left(province,2) from `user` as user0 
where province like '省')as a)
where id in (SELECT id from user where province like '%省')as user1)

//于是我就在网上找了下,要嵌套查询
//好像只有mysql有查出来的数据不能立即修改这个错误,这个错误再嵌套一层子查询就可以了
//然后如果查询结果数据重复就会报重复错误

//数据重复错误就需要将查询出来的结果字段改成别的字段 
//例如 name,最后再子查询表中的 name 获得结果的数据
//反正最后只要结果数据可以被找到就行.

//最终语句
UPDATE user set province=(SELECT left(province,2) from (SELECT pass from `user` as user0 where province like '省')as a 
where a.pass=`user`.pass) where id in 
((SELECT id from (SELECT `name` from user where province like '%省')as user1 where user1.name=`user`.`name`))

————————————动态查询并且跨数据库查询表,将查询出来的数据作为数据库名拼接要查询的表名,我在这个表里添加了dataName字段,里面是与name对应的数据库的名字——————————

//我想在页面上搞个根据不同网站名来管理对应的数据库的功能,所以先建一个表
//添加网站名以及对应的数据库名进一张表,记录了对应网站的数据库名字方便管理

//然后我写完语句发现表名无法加上去,然后使用 concat() 拼接字符串 链接
//https://www.cnblogs.com/yingmo/p/6148360.html

SELECT * FROM (SELECT concat(dataName,'.user') FROM web_manage where name='拼多多') as a;

//拼接成功了,但是结果还是对应的数据库名加表名,不是我想查询的数据库中user表中的数据
//到了这里我大概也知道查询出的是dataName字段数据的字符串
//它似乎不被sql当成一个变量,就像sql通过数据库名查询数据库中表的数据(我是这么理解的)

//然后我就找到了 sql动态语句 execute ,用来执行动态sql语句 —动态sql语句使用链接 https://www.cnblogs.com/mfmdaoyou/p/6704521.html

//最终结果
set @checkUser=concat('SELECT * FROM ',(SELECT dataName FROM web_manage where name='拼多多'),'.user');
prepare stml from @checkUser;
EXECUTE stml;
————————————动态查询并且跨数据库查询不同表中某一字段所有相同数据的总和——————————

//需要搞一个动态跨数据库查询不同表中某一字段所有相同数据的总和

// union 可以将两个查询结果合并但必须要有相同的列与相似的类型,类似表结构一致 链接 https://www.cnblogs.com/xiangshu/articles/2054447.html
//但因为我要获取的是相同省份的总数,所以不使用 union ,使用 union all
//sql 语句打少了,脑子转不过来想了几个小时,最后拿出笔和纸理一下可能性,一下就想通了
//下面有我放的图片

//最终代码
set @checkUser=concat('SELECT province,count(*) FROM (SELECT province FROM ', (SELECT dataName FROM web_manage where name='拼多多'),'.user 
union all SELECT province FROM ',
(SELECT dataName FROM web_manage where `name`='QQ音乐'),'.user)t group by province');
prepare stml FROM @checkUser;
EXECUTE stml;

 


总结

这里怎么还有个总结,总结,没有总结,全是坑。

<think> 我们正在处理的问题:用户想要在MySQL替换字段中的特定字符'['(即左方括号)。根据之前的对话,我们知道在MySQL中可以使用REPLACE函数来实现。 然而,需要注意的是,在MySQL中,方括号在某些上下文中可能有特殊含义(例如在LIKE模式匹配中),但在REPLACE函数中,它们只是作为普通字符处理。 根据引用[1]和[2]提供的示例,我们可以这样写: UPDATE 表名 SET 字段名 = REPLACE(字段名, '[', '替换成的字符') WHERE 字段名 LIKE '%[%'; 但是,用户之前的问题中提到了嵌套的REPLACE,并且涉及到了使用CHAR函数来生成字符。我们知道,'['的ASCII码是91,所以也可以使用CHAR(91)来表示。 因此,有两种写法可以选择: 1. 直接用字符串'[': UPDATE table_name SET column_name = REPLACE(column_name, '[', '') WHERE column_name LIKE '%[%'; 2. 使用CHAR函数: UPDATE table_name SET column_name = REPLACE(column_name, CHAR(91), '') WHERE column_name LIKE CONCAT('%', CHAR(91), '%'); 注意:在WHERE子句中,如果使用LIKE匹配特殊字符(如'['),在MySQL中'['并不是通配符,所以可以直接使用。但是,如果担心转义问题,也可以使用CHAR(91)来避免歧义。 不过,根据用户之前的问题,他们想要替换的是字段中的'['字符,所以我们直接提供以下SQL语句: 如果只是简单地移除'['字符(即替换为空字符串): ```sql UPDATE 表名 SET 字段名 = REPLACE(字段名, '[', ''); ``` 或者,为了更通用(避免字符集问题): ```sql UPDATE 表名 SET 字段名 = REPLACE(字段名, CHAR(91), ''); ``` 注意:在WHERE条件中,我们通常可以省略,因为即使字段中没有'[',替换也不会改变原值。但是,如果为了提高性能(特别是大表),可以加上条件只更新包含'['的行: 使用字符串形式: ```sql UPDATE 表名 SET 字段名 = REPLACE(字段名, '[', '') WHERE 字段名 LIKE '%[%'; ``` 使用CHAR形式: ```sql UPDATE 表名 SET 字段名 = REPLACE(字段名, CHAR(91), '') WHERE 字段名 LIKE CONCAT('%', CHAR(91), '%'); ``` 根据引用[1]和[2]的做法,我们推荐使用第一种直接使用字符串的方式,因为更直观。但也要注意,在某些字符集下,方括号可能不是单字节字符,但在常用的字符集(如utf8)中,'['是单字节字符,所以两种方法都可以。 因此,回答如下: </think> 在 MySQL替换字段中的方括号字符 `[`(ASCII 91),可以使用以下两种 SQL 语句方案: ### 方案 1:使用字符字面量(推荐) ```sql -- 更新整个表 UPDATE 表名 SET 字段名 = REPLACE(字段名, '[', '新字符'); -- 仅更新包含 [ 的记录 UPDATE 表名 SET 字段名 = REPLACE(字段名, '[', '新字符') WHERE 字段名 LIKE '%[%'; ``` > 说明:直接使用字符串 `'['` 更直观高效,适用于大多数场景[^1][^2]。 ### 方案 2:使用 CHAR() 函数 ```sql -- 精确替换 ASCII 91 字符 UPDATE 表名 SET 字段名 = REPLACE(字段名, CHAR(91), '新字符') WHERE INSTR(字段名, CHAR(91)) > 0; ``` > 说明:`CHAR(91)` 生成 ASCII 91 字符(`[`),`INSTR()` 比 `LIKE` 更高效定位字符位置[^2]。 ### 关键点说明 1. **替换逻辑** `REPLACE(字段名, '原字符', '新字符')` 会替换所有匹配项 - 将 `'新字符'` 设为空字符串 `''` 可完全移除 `[` - 示例移除 `[`:`REPLACE(字段名, '[', '')` 2. **字符表示选择** ```mermaid graph LR A[替换方括号] --> B{字符表示方式} B --> C[直接使用 '['] B --> D[使用 CHAR(91)] C --> E[更直观易读] D --> F[处理特殊编码场景] ``` 3. **性能优化建议** - 大表操作添加 `WHERE` 条件避免全表扫描 - 先 `SELECT` 验证再执行 `UPDATE`[^3] ```sql -- 验证语句 SELECT 字段名, REPLACE(字段名, '[', '') AS 处理后 FROM 表名 WHERE 字段名 LIKE '%[%'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值