日常SQL问题记录

298 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

首先声明,本文SQL语句基于msSQL(即SQLServer)数据库,其他数据库并未测试过,请谨慎使用

空手写SQL的能力其实一定程度上最可以看出来一个后端程序员的水平了
对于一个工作中很少接触SQL,工作上基本全是繁杂的业务,偶尔需要写一个简单点的SQL,勉强还能写出来
稍微复杂点的,就比较头疼了,遇到那么一两次,比如聚合查询、多表联查等等
其实SQL语句有时候不是必须的,但是很方便,快捷,深入学习一下还是有必要的,看过我文章的都知道,我喜欢用不同的方法去解决同一个问题,同样的查询,用Linq同样也能实现,但是学会SQL,跟这个并不矛盾!
话不多说,开始介绍
本文将通过介绍我遇到过的几个小问题入手,以及解决办法\

问题一:SQL中Where语句后面的怎么写关系表达式(比如if...else)

我的需求:
当状态status条件为空时,不需要写Where,而当status条件不为空时,Where语句需要根据status进行过滤
转换为程序员语言:if(status = -1){where不需要写}elseif(status > 0)(where根据status进行过滤)
而众所周知,Where语句中只能是一个布尔值结果的表达式,不能是一个if/else吧

解决办法:
用 and 和 or 代替if/else

SELECT 
    * 
FROM 
    dbo_Operation 
Where({status} >= 0 and Status = {status}) or ({status} < 0)

SQL解析:
当status为空(status = -1),先看or左边表达式,and的左边为false,就没必要继续看and右边表达式了(程序这里也不会执行它了,直接赋值false),第一个括号里的结果就是false(细品:false and 任意布尔值,其结果都是false!.....与运算,一假则假), 而or后面表达式为true,就会执行or后面的表达式,where表达式就变成了where(true),并不会起到筛选作用,跟没写一样,已达到目的!
当status不为空(status为大于-1的任意整数),同上道理,or两边只要有一个true就会生效,明显or右边为false(或运算,全假才假),or左边,and左边条件成立,true,那and右边筛选就会生效,整体看where语句就会变成where(Status ={status}),目的也达到了!
嘴说为虚,眼见为实!
实测一把\

  • status为 -1 时,将sql中{status}替换为-1如下并执行 image.png

  • status为1 时 image.png

问题二:枚举值的别名问题

临时需求:
客户突然发消息过来,让我给他导出一份数据出来,马上开会要用,然后提出各种条件
一看,涉及到多表查询,还需要输出多个多个表的多个字段信息,第一感觉比较复杂
决定用SQL直接写吧,磨腾半个多小时终于写出来,但是表头总不能是英文单词吧,需要转化为客户能看懂的中文
简单,直接 字段 as '中文名称'
那如果字段为枚举值呢,不同的枚举值,可是代表着不同的含义的,比如商品类型:外购、生产、其他

解决办法:
用 case/when...then...end

SELECT 
    Name as '名称',
    (case ProductType 
        when '0' then '外购',
        when '1' then '生产',
        when '2' then '其他'
        end) as '商品类型'
FROM
......

如上,这里暂时每找到合适的数据进行查询测试,就不测试了,SQL完全是可行的

好了本文暂时就到这里了,后续工作中再遇到其他的相关问题,再进行补充吧

文末总结

不积跬步,无以至千里!古人还是很有智慧的,一个人无论走了多远,他都是从迈开第一步开始的,如果你不迈开腿走第一步,那永远也到达不了目的地!
小问题小知识。开卷有益,打开书本,无论多少,总有收获,哪怕就是闻闻油墨味,日久也能熏一身书生气!
哈哈哈哈,鸡汤结束