首先创建表:
CREATE TABLE members (
ID serial PRIMARY KEY,
first_name VARCHAR (50) NOT NULL,
last_name VARCHAR (50) NOT NULL,
gender SMALLINT NOT NULL
插入示例数据:
INSERT INTO members ( first_name, last_name, gender)
VALUES
('John', 'Doe', 1),
('David', 'Dave', 1),
('Bush', 'Lily', 2);
我们希望计算男女成员的比例:
SELECT
(SUM (
WHEN gender = 1 THEN 1
ELSE 0
) / SUM (
WHEN gender = 2 THEN 1
ELSE 0
) ) * 100 AS "Male/Female ratio"
members;
因为 gender = 1 有两条, 2 有1条,返回值 为 200% ,结果正确。现在删除female记录:
DELETE FROM members
WHERE gender = 2;
再次执行上面查询返回错误,因为除数为零。让我们使用nullif函数进行修正:
SELECT
SUM (
WHEN gender = 1 THEN 1
ELSE 0
) / NULLIF (
SUM (
WHEN gender = 2 THEN 1
ELSE 0
), 0
) * 100 AS "Male/Female ratio"
FROM members;
使用nullif函数检查sum函数值是否为0,如果为 0 则返回null ,从而整个结果为null ,成功避免了除数为 0 .
本文介绍了COALESCE 和 NULLIF 函数,通过对比学习,可以在合适的场景中组合使用增强你的SQL能力。
本文学习PostgreSQL COALESCE 和 NULLIF函数。COALESCE它返回第一个非空参数,并通过示例让你了解如何在select语句中有效处理空值。NULLIF需要两个参数,参数相同返回null,否则返回第一个参数。通过同时学习两个函数,可以区分两者,同时可以组合使用,增强你SQL的健壮性。PostgreSQL COALESCE 函数语法 COALESCE 函数语法:COALESCE (argument_1, argument_2, …); 参数可以有无限个,总是返回第一个.
一、postgresql中条件表达式
今天上班的时候,有一个哥们跑过来问我,pg有没有行转列的函数,如何实现行转列,他说他pg中没有找到,问我知道不,我想了一下,好像有,不过不像SQLserver 那么好用,但行转列很简单啊,使用多个union all 就简单搞定了啊,于是他给我看了他的问题
select id,a,b,c,d,e,f,g
from biztable;
想比较 a,b,c,d,e...
工作中迁移mysql至pg 9.6,遇到mysql中的ifnull函数在pg中没有,pg中函数coalesce与ifnull功能相同,但函数名不同,需要修改应用。ifnull也在SQL标准中,pg此处不符合sql标准规范。本人尝试修改pg源码添加了ifnull函数,在此做一分享,不当之处请各位批评指正。
ifnull语法规范
语法格式:
IFNULL(expr1 任意类型, expr2 任意...
postgresql中的coalesce函数用于返回参数列表中第一个非空值。如果所有参数都是空值,则返回null。
例如,coalesce(null,1,2)将返回1,因为1是第一个非空值。如果所有参数都是null,则coalesce(null,null,null)将返回null。
### 回答2:
### 回答3: