Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.2k views
in Technique[技术] by (71.8m points)

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

如果你在设计表结构的时候,没给有给 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 之类的值,以此类推。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...