关于mysql的sql语句中,1=1的用法?

瑞hong不还钱
  • 52

在mybatis/原生的mysql语句中,有时会看到类似:select……from table where 1=1 and 条件A。据了解是为了避免:条件A判断出错 或者 往条件A传值时,传了空值,导致sql报错。

请问是这样吗?还是有别的原因?请指教,谢谢

回复
阅读 3.1k
7 个回答

复杂的条件查询,需要考虑各种情况下,where 部分的语句是否语法正确。
为了解决这个问题,现在大部分的动态sql都建议加上 where 1=1.
你可能会想到sql的性能,我以前测试过 where 1=1,因为它总是TRUE,执行计划就会忽略这个条件,
SQL Server ,Oracle、MySQL 和 PostgreSQL 结果都一样。

据了解是为了避免:条件A判断出错 或者 往条件A传值时,传了空值,导致sql报错。

你说的传空值,这个需要考虑在SQL在执行前,需要进行各种适当性检查,正常情况下不应该传空值的,
可以考虑这样,只有A满足某种条件然后再加入到where中

   where 1=1.
   if A 是 true
     and xxxx  A
   end if

还有个原因,在写 ORM 工具时,前面有 where 1=1
后面就可以无脑的 push (and 条件)进去,比如:select().where(xxx).where(xxx)
否则要多写一层判断,判断原来有没有 where 子句

  • 2
新手上路,请多包涵

有可能整条语句就是动态语句吧,‘AND 条件A’应该是一个整体A拼接到语句中的,如果A需要判断,那么A条件不一定存在,where后面可能为空了,所以加上‘1=1’

防止Where后没有条件报错

suzumiy
  • 2
新手上路,请多包涵

条件查询很多时候是

<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

这样不用判断where后的第一个条件用不用加and

之前刚学后端也是有这个问题,后来才知道是为了避免一些查询条件错误

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏