数据库 - MySQL转换SQL Server时,替换 FIND_IN_SET 函数引发的问题

MySQL转换SQL Server时,替换 FIND_IN_SET 函数引发的问题

 在之前的文章中,我列举出了一个当 MySQL 转换 SQL Server 时,FIND_IN_SET 函数在 SQL Server 中的解决方案:链接

 就是使用

charindex(cast(匹配列 as varchar(50)), 被匹配列(多个用,分开的值)) <![CDATA[ > ]]> 0

替换 MySQL 中的 FIND_IN_SET。

但是!!!这个方案在生产环境中,引发了非常大的问题:比如匹配列是"8",但被匹配列是"58,59",这个判断依然是成立的,也就是说引起了错误的外键关联,这是非常危险且不可接受的。

所以我选取了如下方案去修复:

复制代码
select *
from table1 t1
         left join (select t2.*,
                           '声明一个新的列' = substring(被匹配列, b.number,
                                                        charindex(',', 被匹配列 + ',', b.number) -
                                                        b.number)
                    from table2 t2
                             inner join master.dbo.spt_values b
                                        on b.number between 1 and len(被匹配列)
                                            and
                                           substring(',' + 被匹配列, b.number, 1) =
                                           ','
                    where b.type = 'P') t3 on t1.匹配列 = t3.新的列
复制代码

其中 master.dbo.spt_values 是SQL Server 的内置表,具体作用可以在网络上找到,这里就不详细描述了。

虽然这种方式可以从根本上解决FIND_IN_SET函数的迁移问题,但这种针对这种复杂逻辑,如果时间允许的话,还是迁移到后台服务中好一些。

 

posted @   Helios_Fz  阅读(249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩