在mybatis/原生的mysql语句中,有时会看到类似:select……from table where 1=1 and 条件A。据了解是为了避免:条件A判断出错 或者 往条件A传值时,传了空值,导致sql报错。
请问是这样吗?还是有别的原因?请指教,谢谢
在mybatis/原生的mysql语句中,有时会看到类似:select……from table where 1=1 and 条件A。据了解是为了避免:条件A判断出错 或者 往条件A传值时,传了空值,导致sql报错。
请问是这样吗?还是有别的原因?请指教,谢谢
还有个原因,在写 ORM 工具时,前面有 where 1=1
后面就可以无脑的 push (and 条件)进去,比如:select().where(xxx).where(xxx)
否则要多写一层判断,判断原来有没有 where 子句
条件查询很多时候是
<if test="参数A!-null">
and 列名A = #{参数A}
</if>
<if test="参数B!-null">
and 列名B = #{参数B}
</if>
...
如果条件全部不符合 sql就会变成
select * from table where
这样sql会因为语法错误报错,所以会有在条件前加上1=1的写法
<where></where>标签现在好像可以取代这种写法
可以参考 https://www.cnblogs.com/caoyc/p/5574966.html
8 回答6.4k 阅读
5 回答3.3k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
1 回答4.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
2 回答3.2k 阅读
复杂的条件查询,需要考虑各种情况下,where 部分的语句是否语法正确。
为了解决这个问题,现在大部分的动态sql都建议加上 where 1=1.
你可能会想到sql的性能,我以前测试过 where 1=1,因为它总是TRUE,执行计划就会忽略这个条件,
SQL Server ,Oracle、MySQL 和 PostgreSQL 结果都一样。
你说的传空值,这个需要考虑在SQL在执行前,需要进行各种适当性检查,正常情况下不应该传空值的,
可以考虑这样,只有A满足某种条件然后再加入到where中