简单的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)
参数说明
conditionLNNVL函数查询条件。

描述

说明 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