简单的WHERE子句无法对包含空值的数据进行筛选,您可以在PolarDB PostgreSQL版(兼容Oracle)集群中安装LNNVL函数,对包含空值的数据进行筛选。
安装
PolarDB PostgreSQL版(兼容Oracle)通过插件的形式支持LNNVL函数,您需要完成安装后才能使用该函数,安装命令如下:
SET client_min_messages TO 'ERROR';
CREATE EXTENSION if not exists polar_lnnvl;
RESET client_min_messages;
语法
lnnvl(condition)
参数 | 说明 |
---|---|
condition | LNNVL函数查询条件。 |
描述
说明 LNNVL函数仅支持在WHERE子句中使用。
LNNVL函数以条件作为参数。
- 如果该条件可在表中匹配到数据,则返回所有未匹配该条件的数据(含空值)。
- 如果该条件无法在表中匹配到数据,则返回表中所有数据(含空值)。
- 如果该条件仅匹配到表中的空值,则返回表中所有数据(不含空值)。
例如,某张表中存在如下两行数据:
name | id
------------
a | 2
b | null
使用不同的条件,LNNVL函数的返回结果如下。
条件 | 是否匹配到数据或空值 | LNNVL返回值 |
---|---|---|
lnnvl(id=1) | 否 | a行和b行 |
lnnvl(id=2) | 是 | b行 |
lnnvl(id>2) | 否 | a行和b行 |
lnnvl(id<2) | 否 | a行和b行 |
lnnvl(id is null) | 是 | a行 |
示例
使用如下命令创建一个名为account
的表,并插入测试数据:
create table account(name varchar2(20),year number);
insert into account values('peter2001',2001);
insert into account values('peter2002',2002);
insert into account values('peter2003',2003);
insert into account values('peter2004',2004);
insert into account values('peter2005',2005);
insert into account values('peter2006',2006);
insert into account values('peter2007',null);
- 当条件为
year<2003
时,LNNVL就会返回年份大于等于2003或者空值的行。查询语句如下:
select * from account where lnnvl(year<2003);
查询结果如下:
name | year -----------+------ peter2003 | 2003 peter2004 | 2004 peter2005 | 2005 peter2006 | 2006 peter2007 | null
- 当条件为
year is not null
时,LNNVL就会返回年份是空值的行。查询语句如下:
select * from account where lnnvl(year is not null);
查询结果如下:
name | year -----------+------ peter2007 | null
- 当条件为
year is null
时,LNNVL就会返回年份不是空值的行。查询语句如下:
select * from account where lnnvl(year is null);
查询结果如下:
name | year -----------+------ peter2001 | 2001 peter2002 | 2002 peter2003 | 2003 peter2004 | 2004 peter2005 | 2005 peter2006 | 2006
- 当条件为
year=2008
时,LNNVL就会返回年份不为2008的行。查询语句如下:
select * from account where lnnvl(year=2008);
查询结果如下:
name | year -----------+------ peter2001 | 2001 peter2002 | 2002 peter2003 | 2003 peter2004 | 2004 peter2005 | 2005 peter2006 | 2006 peter2007 | null
- 当条件为
year!=2008
时,LNNVL就会返回年份为2008或空值的行。查询语句如下:
select * from account where lnnvl(year!=2008);
查询结果如下:
name | year -----------+------ peter2007 | null