MySQL查询仅匹配以数字开头的supplier_name,求排查SQL语句问题
问题分析与解决方案
你的查询语句出现这种差异的核心原因是MySQL的隐式类型转换在搞鬼,具体来说是b.supplier_name!=0这个条件导致的。
为什么会这样?
假设product表的supplier_name字段是字符串类型(比如VARCHAR),当你把字符串和数字0做比较时,MySQL会自动把字符串转换成数字再进行比较:
- 对于以数字开头的字符串(比如
'2020103'),转换后是对应的数字2020103,显然不等于0,所以会通过b.supplier_name!=0的条件。 - 对于以字母开头的字符串(比如
'U13002L1'),MySQL无法将其转换成有效数字,会直接转为0,这时候b.supplier_name!=0就变成了0!=0,结果为false,所以这类记录会被过滤掉。
另外,b.supplier_name!=''这个条件其实已经能排除空字符串,但结合!=0的类型转换问题,才导致了你的异常结果。
修正方案
你需要把数字0改成字符串'0',让比较在相同类型之间进行,避免隐式转换:
SELECT a.*, b.* FROM `links` a, `product` b WHERE a.title LIKE CONCAT('%',b.supplier_name,'%') AND b.supplier_name != '' AND b.supplier_name != '0';
如果你的业务场景中还需要排除其他类似的无效值(比如全空格的字符串),可以进一步优化条件,比如加上TRIM(b.supplier_name) != ''和TRIM(b.supplier_name) != '0',确保过滤更彻底。
内容的提问来源于stack exchange,提问作者popkutt
相关产品推荐
相关产品推荐

