mysql有些字段是非必填的,传空要查所有数据该怎么处理?

SELECT 
    *
FROM 
    content
WHERE 
    cityId='C-e834160464892529719476' and
    regionId='a-10c7160465073001499199'

其中cityId和regionId是非必填的,前端可以传空也可以传值。如果改为regionId=''就查不出来了,因为数据库没有regionId为空的数据。这不是我想要的

我想要的是cityId和regionId传空就查所有数据,这该怎么优化呀?

阅读 4.1k
5 个回答

如果你在设计表结构的时候,没给有给 char 类型字段设置默认值(如 ''),那么在mysql 他存储的就是null

所以,如果你是要查指定cityId 并且 regionId 为空的sql 就这么写:

SELECT 
    *
FROM 
    content
WHERE 
    cityId='C-e834160464892529719476' and
    regionId is null

如果你要查的条件为 cityId,regionId 传空的时候,不做为限制条件就改为

SELECT 
    *
FROM 
    content
WHERE 
    cityId='C-e834160464892529719476'

如果你是问,这两个sql能不能合并成一个sql,答案是可以
已java的mybatis为例:

<select id="query" parmeter="parmType" result="Type">
    SELECT 
    *
FROM 
    content
WHERE 
    1=1
    <if test="cityId!=null and cityId!=''">
        and cityId=#{cityId}
    </if>
    <if test="regionId!=null and regionId!=''">
        and regionId=#{regionId}
    </test>
</select>

同理可知,在其他的语言当中你也需要动态的拼接sql,来达到查询不同条件的效果。

最后,在设计表结构的时候,尽量不要有 null 的存在,如果是字符串,就给个 '' 默认值,如果是数字,就给个 0 或者-1 之类的值,以此类推。

我问了几个java的同事,他们好像是用代码控制的而不是控制sql,我是用node写的该怎么控制

用了mybatis了吗,xml里面可以if判断。如果没有用框架,就需要在代码里面拼接sql

都是代码控来控制orm或者查询框架来动态生产sql的

用ORM查询它不香吗?为啥手写sql语句………手写的话你只能判断参数是否存在生成对应的ORM

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