如何在Python的SQL语句中使用%通配符?逗号分隔账号存在性查询
检查逗号分隔账号列的存在性:优化你的SQL写法
老哥,我之前也踩过这种把多个账号塞到同一列里的坑,你的思路方向是对的,但原写法有几个可以优化的点,不管是严谨性还是简洁度都能提上来,给你梳理下:
先说说原写法的问题
- 原SQL里的
LIKE %s,%没有给匹配字符串加单引号,数据库直接执行肯定会报错,因为LIKE后面的匹配值得是字符串类型 - 直接用
%s拼接如果没做好参数化,很容易踩SQL注入的坑,尤其是账号来自用户输入的话 - 四个OR的匹配逻辑容易出现误判,比如你要找
00001,可能会匹配到包含这个串的000010这种账号
给你两种靠谱的优化方案
方案1:通用型LIKE写法(适配大部分数据库)
把查询条件简化成一个,同时处理好边界问题,避免误匹配:
account_exists = "SELECT * FROM finance_collection.member WHERE CONCAT(',', account_ids, ',') LIKE CONCAT('%,', %s, ',%')"
原理很简单:给account_ids前后都加个逗号,比如原列值是00001,00002,就变成,00001,00002,,然后匹配,00001,,这样不管账号在开头、中间还是结尾,都能准确匹配,还不会误判类似000011的账号。
方案2:MySQL专属简化写法
如果你的数据库是MySQL,那直接用FIND_IN_SET函数就行,这个函数就是专门处理逗号分隔的列的,写法超简洁:
account_exists = "SELECT * FROM finance_collection.member WHERE FIND_IN_SET(%s, account_ids) > 0"
它会返回目标账号在分隔列里的位置,不存在就返回0,所以判断大于0就代表存在,逻辑清晰还不容易写错。
最后提个重要提醒
不管用哪种写法,一定要用参数化查询,别直接把账号拼到SQL字符串里,不然很容易被SQL注入攻击。另外说句题外话,这种把多个值塞到单个列的设计其实不符合数据库第一范式,长远来看最好拆成关联表(比如建个member_accounts表,一行存一个会员ID对应一个账号),查询效率和维护性都会好很多。
内容的提问来源于stack exchange,提问作者desmostachya
相关产品推荐
相关产品推荐

