内容为原创,转载请标注转载自http://t.csdn.cn/N3O7j
http://t.csdn.cn/N3O7j

在这里对name和alias_name模糊查询完,对data_type和data_layer_type进行筛选,再调用in,根据结果来看是.in不起作用,没做到筛选的作用。上面代码生成的sql语句如下:
SELECT id,name,alias_name,data_type,data_layer_type,description,creator,catalog_id,tenant_id,create_time,creator_id,update_time,operator_id,del_flag FROM sgeoc_template_data WHERE del_flag=0 AND name LIKE '%t%' OR alias_name LIKE '%t%' AND catalog_id IN ('668b2cfec83df2385de8c04a00328400')) LIMIT 25
乍一看是没什么问题的,这里的坑在于忽略了在sql中AND是优先于OR的,所以这条sql语句在执行时条件就变成name like %t%或者(alias_name like %t%并且catalog_id 在catalogTreeIds中)。OR是有短路逻辑的,所以前面name符合的数据就都会被输出。
因此代码应该改成

sql语句就会变成
SELECT id,name,alias_name,data_type,data_layer_type,description,creator,catalog_id,tenant_id,create_time,creator_id,update_time,operator_id,del_flag FROM sgeoc_template_data WHERE del_flag=0 AND (name LIKE '%t%' OR alias_name LIKE '%t%') AND catalog_id IN ('668b2cfec83df2385de8c04a00328400')) LIMIT 25
将name like %t%和alias_name like %t%用()括起来了。in就起作用了
本文探讨了一个SQL查询中AND和OR操作符的优先级问题,指出当AND和OR同时存在时,AND的优先级高于OR。作者通过实例解释了由于忽视这一优先级导致的查询错误,即OR的短路逻辑使得筛选条件未正确应用。解决方案是使用括号明确指定优先级,确保IN操作符能够正常工作。
2936

被折叠的 条评论
为什么被折叠?



