PostgreSQL条件表达式

Posted 懵懂小虎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL条件表达式相关的知识,希望对你有一定的参考价值。

  条件表达式在日常工作中很多场景都会用到,比如某个字段为空,取另外一个字段;某个值大于多少,取什么字段,小于多少取什么字段等等。那么下面来简单的学习下PostgreSQL有那些条件表达式。

1、CASE

  CASE表达式是一种通用的条件表达式,类似于编程语言中的if else语句。具体语法如下:

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

CASE子句可以用于任何表达式可以存在的地方。condition是一个返回boolean的表达式。如果条件的结果为true,那么CASE 表达式的结果就是符合条件的result,并且不再处理剩余的CASE表达式。如果条件的结果为false,那么以相同方式搜寻任何随后的WHEN子句。如果没有WHEN conditiontrue, 那么表达式的结果就是在ELSE子句里的result。 如果省略了ELSE子句且没有匹配的条件,结果为NULL。如下例子:

select id,
(CASE WHEN id=1 THEN \'one\'
	WHEN id=2 THEN \'two\'
	WHEN id=3 THEN \'three\'
	WHEN id=4 THEN \'four\'
	ELSE \'other\'
	END) AS ids 
from student;

--结果:
id|ids  |
--|-----|
 1|one  |
 2|two  |
 3|three|
 4|for  |

除了上面的写法,CASE还有另外一种变体,语法如下:

CASE expression
    WHEN value THEN result
    [WHEN ...]
    [ELSE result]
END

先计算expression的值,然后与每个WHEN子句里声明的value表达式对比,直到找到一个相等的。 如果没有找到匹配的,则返回在ELSE子句里的result(或者NULL)。将上面的例子改一下为:

select id,
(CASE id WHEN 1 THEN \'one\'
	WHEN 2 THEN \'two\'
	WHEN 3 THEN \'three\'
	WHEN 4 THEN \'four\'
	ELSE \'other\'
	END) AS ids 
from student;

--结果:
id|ids  |
--|-----|
 1|one  |
 2|two  |
 3|three|
 4|for  |

CASE语句不光可以在select后使用,也可以在where后使用,当有时某个字段需要条件来处理时,就可以使用,如下:

select id from student WHERE (CASE WHEN id >2 THEN \'a\' ELSE \'b\' END) = \'a\'
--结果:
id|
--|
 3|
 4|

2、COALESCE

  使用过Oracle数据库的肯定知道里面的NVL函数,那么在PostgreSQL数据库可以用COALESCE函数来实现类似功能。

COALESCE(value [, ...])

COALESCE返回它的第一个非NULL的参数值。如果所有参数都是null那么返回null。 它常用于在显示数据时用缺省值替换 NULL。例如:

select COALESCE(s.address,\'地址不详\') AS address FROM student s
--结果:
address|
-------|
天河一路   |
天河一路   |
地址不详   |
地址不详   |

这个函数指判断NULL,如果字段为空字符串,则不在范围

3、NULLIF

NULLIF(value1, value2)

当且仅当value1等于value2时, NULLIF才返回null。否则它返回value1

select NULLIF(address,grade),address,grade FROM student s
--结果:
nullif|address|grade|
------|-------|-----|
天河一路  |天河一路   |一年级1班
天河一路  |天河一路   |一年级2班
          |天河一路   |天河一路 |
          |天河一路   |天河一路 |

常用的条件表达式就这些了。

以上是关于PostgreSQL条件表达式的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 正则表达式用条件替换函数

简化条件表达式

我的重构第一步

Drupal 8 和 PostgreSQL:如何在 WHERE 子句中使用表达式的结果?

PostgreSQL 是不是支持表(片段)的透明压缩?

PostgreSQL 表达式