2020-8-10 PostpreSQL中实战小结(case...when...心得,with..as..和view的区别)
case…when…使用心得
case when类似于python中的if else语句,但经过最近一段时间使用,我觉得其实更像是完成了一种关系的映射。接下来先说语法吧,自己也说的不太清楚,先总结看看吧。以下表为例。
语法一
case when 列名condition then 输出结果 when 列名condition then 输出结果 … else 输出结果 end;
利用此语法将id化成对应的英文
select case when id=1 then ‘one’ when id=2 then ‘two’ when id=3 then ‘three’ else ‘four’ end, t.name, t.age, t.address, t.salary from company t;
语法二
case 列名 when 列名中的值 then 输出结果 when 列名中的值 then 输出结果 … else 输出结果 end;
但注意该语法的局限性,就是后面when接的条件表示列名等于时,对于其他条件不适用。但在某种特定的条件下会简化操作。同样以上述问题为例。
select case id when 1 then ‘one’ when 2 then ‘two’ when 3 then ‘three’ else ‘four’ end, t.name, t.age, t.address, t.salary from company t;
拓展
根据以上例题,我们对salary列进行薪资的划分,如果salary小于2000定为low,相反定位high。
select t.id, t.name, t.age, (case when salary <= 2000 then ‘low’ else ‘high’ end) as level from company t;
– 这里起别名的时候必须要用as,否则会报错,其实我也搞不懂PSQL中啥时候必须要用as,啥时候又可以省略,还有什么时候加引号,定义为字符串,害,慢点尝试吧。
case when主要作用于列,同时根据该列每一个元素进行判断,然后赋予一定的值,但要注意,同一个case when赋的值必须得是同一类型的数据,如果是int,那么都必须的是int。同时赋的值还可以是同行其他值,至于其他赋值,目前还不太清楚。
例题:对上表age进行判断,若age小于25则保留原数值,若大于25,则定义为99。
select t.id, t.age, case when age < 25 then t.age else 99 end as new_age from company t;
从以上操作可以看出,case when主要是对表中的某列的每一行进行判断,若满足条件,则可以映射到一个自定义的数值,或者该行其他列的值(但需保证case when创建的列数值类型一致)。
with…as…和view的区别
最主要的区别就是with…as…创建的表是临时性的,在当前语句中可用,一旦该语句结束,创建的表就会消失。但view却不是临时性的,虽然是一个伪表,但是创建语句结束后仍可以用到其他语句。以上述例子为例。
with data as (select * from company) select * from data where data.id in (1, 3);
当语句结束是再查询data表,则会报错
创建的表可以不止一个。
with data1 as (select * from company), data2 as (select * from company) (select * from data1) union all (select * from data2);
view就不多介绍了,但是经过这两天的实践,发现自己在建报表的时候,用到非常多的视图,经过询问,发现视图其实并没有这么使用,自己现在其实是不太理解的,估计还是自己写得少,理解不够深入,以后再多多学习吧。