精华内容
下载资源
问答
  • 首先null值不会分配空间,这一点与''是本质区别,但是表现形式是一样的...null判断,is null,is not null hank=> create table tab1 (a int ,b varchar(20)); CREATE TABLE hank=> insert into tab1 values(1,'han
    首先null值不会分配空间,这一点与''是本质区别,但是表现形式是一样的
    
    首先null值与任何值做布尔运算,结果都是false


    null值判断,is null,is not null
    hank=> create table tab1 (a int ,b varchar(20));
    CREATE TABLE
    hank=> insert into tab1 values(1,'hank');
    INSERT 0 1
    hank=> insert into tab1 values(1,null);  
    INSERT 0 1
    hank=> insert into tab1 values(1,'askasdjk');
    INSERT 0 1
    hank=> select * from tab1 where b <>'hank';
     a |    b     
    ---+----------
     1 | askasdjk
    (1 row)
    可见b为null的值是不被筛选的
    hank=> insert into tab1 values(1,'');        
    INSERT 0 1
    hank=> select * from tab1 where b <>'hank';  
     a |    b     
    ---+----------
     1 | askasdjk
     1 | 
     ''是可以被筛选的
    要想达到效果,可以用如下写法
    select * from tab1 where b <>'hank' or b is null;
     a |    b     
    ---+----------
     1 | 
     1 | askasdjk
     1 | 
    (3 rows)
    hank=> select * from tab1 where coalesce(b,'0')<>'hank';
     a |    b     
    ---+----------
     1 | 
     1 | askasdjk
     1 | 
    (3 rows)




    null值排序
    hank=>  select ctid,* from tab1 where b <>'hank' or b is null order by b nulls first;
     ctid  | a |    b     
    -------+---+----------
     (0,2) | 1 | 
     (0,4) | 1 | 
     (0,3) | 1 | askasdjk
     hank=> select ctid,* from tab1 where b <>'hank' or b is null order by b nulls last; 
     ctid  | a |    b     
    -------+---+----------
     (0,4) | 1 | 
     (0,3) | 1 | askasdjk
     (0,2) | 1 | 
    (3 rows)




    null值排序对索引的影响
    null列索引注意一定要一致,否则索引用不到
    insert into tab1 select generate_series(1,1000),'hank'||generate_series(1,1000);
    hank=> create index idx_tab1_b on tab1(b nulls first);
    hank=> explain select * from tab1  order by b limit 1; 
                                 QUERY PLAN                              
    ---------------------------------------------------------------------
     Limit  (cost=21.06..21.06 rows=1 width=11)
       ->  Sort  (cost=21.06..23.57 rows=1004 width=11)
             Sort Key: b
             ->  Seq Scan on tab1  (cost=0.00..16.04 rows=1004 width=11)
    (4 rows)


    hank=> explain select * from tab1  order by b nulls first limit 1;    
                                        QUERY PLAN                                    
    ----------------------------------------------------------------------------------
     Limit  (cost=0.28..0.32 rows=1 width=11)
       ->  Index Scan using idx_tab1_b on tab1  (cost=0.28..49.21 rows=1004 width=11)


    hank=> explain select * from tab1  order by b nulls last limit 1;     
                                 QUERY PLAN                              
    ---------------------------------------------------------------------
     Limit  (cost=21.06..21.06 rows=1 width=11)
       ->  Sort  (cost=21.06..23.57 rows=1004 width=11)
             Sort Key: b
             ->  Seq Scan on tab1  (cost=0.00..16.04 rows=1004 width=11)
    (4 rows)


    可见,null值得先后可以决定索引是否可以用到idx_tab1_b这个索引,需要重新排序




    hank=> create index idx_tab1_b_1 on tab1(b);    
    CREATE INDEX
    hank=>  explain select * from tab1 order by b;
                                      QUERY PLAN                                  
    ------------------------------------------------------------------------------
     Index Scan using idx_tab1_b_1 on tab1  (cost=0.28..49.21 rows=1004 width=11)
    (1 row)


    hank=>  explain select * from tab1 order by b desc;
                                          QUERY PLAN                                       
    ---------------------------------------------------------------------------------------
     Index Scan Backward using idx_tab1_b_1 on tab1  (cost=0.28..49.21 rows=1004 width=11)
    (1 row)


    hank=>  explain select * from tab1 order by b asc; 
                                      QUERY PLAN                                  
    ------------------------------------------------------------------------------
     Index Scan using idx_tab1_b_1 on tab1  (cost=0.28..49.21 rows=1004 width=11)
    (1 row)
    不涉及null值排序的索引不会出现此种情况
    所以有空值的字段如果对null值有排序需求,那么建索引的时候一定要按筛选条件建立。
    展开全文
  • null和”的区别与判断 null是一种类型,''是空字符串,打个比方,''是你参加了考试且得了零分,而null则是你压根就没有参加考试。 如果要在sql中对两者进行判断,是有区别的: //null只能和is或is not...

    null和’'的区别与判断

    null是一种类型,''是空字符串,打个比方,''是你参加了考试且得了零分,而null则是你压根就没有参加考试。

    如果要在sql中对两者进行判断,是有区别的:

    //null只能和is或is not搭配,不能使用=、!=或者<>
    select * from student where name is null;
    select * from student where name is not null;
    
    //''的判断可以使用=、!=或者<>
    select * from student where name = '';
    select * from student where name != '';
    select * from student where name <> '';
    

    使用COALESCE函数

    COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的,如果参数都是null会报错。

    select COALESCE(null,null); //报错
    select COALESCE(null,null,now()::varchar,''); //结果会得到当前的时间
    select COALESCE(null,null,'',now()::varchar); //结果会得到''
    
    //可以和其他函数配合来实现一些复杂点的功能:查询学生姓名,如果学生名字为null或''则显示“姓名为空”
    select case when coalesce(name,'') = '' then '姓名为空' else name end from student;
    
    
    展开全文
  • postgreSQLNULL

    千次阅读 2015-09-21 15:38:20
    但是对于未知,或者不知道的东西可以这么使用,select 的语句,在查询时,首先会判断where语句的正确或者错误,正确(t)才会执行,错误(f)是没有结果的(如上就是例子),如下是如何判断是否是null 或者null就是...

    null 是代表不知道/ 未知,不等于''(空字符串),固然sql中 null = null 或null != null 都是返回结果都是null,例子如下:


    但是对于未知,或者不知道的东西可以这么使用,select 的语句,在查询时,首先会判断where语句的正确或者错误,正确(t)才会执行,错误(f)是没有结果的(如上就是例子),如下是如何判断是否是null 或者null就是null:



    展开全文
  • postgresql 判断参数是否为空,拼接字符串的条件查询
    CREATE OR REPLACE 
    
    FUNCTION 名称(
        IN  no text,
        IN  mac text,
        IN station_no text)
      RETURNS TABLE(v_id integer, v_no text, v_mac text, v_station_id integer, v_station_no integer, v_station_name text) AS
    $BODY$
       DECLARE 
    sql text;
    sql_temp text;
    count integer;
    BEGIN
    sql:='SELECT 
           a.sid, 
    a.no, 
    a.mac,
    b.sid,
    b.no,
    b.name
    FROM tb_handset a
    INNER JOIN tb_station b
            ON a.station_id = b.sid';
            
           IF in_no = '' AND in_mac = '' AND in_station_no = '' THEN
              RETURN QUERY EXECUTE sql;
              
           ELSE


              sql:=sql||' WHERE ';
              sql_temp:='';
              
              IF in_no <> '' THEN
    sql_temp:= sql_temp ||'AND a.no ='''||in_no||'''';
              END IF;


              IF in_mac <> '' THEN
    sql_temp:= sql_temp ||'AND a.mac ='''||in_mac||'''';
              END IF;


              IF in_station_no <> '' THEN
    sql_temp:= sql_temp || 'AND b.no ='''||in_station_no||'''';
              END IF;
              
    SELECT length(sql_temp) INTO count;             //查询字符串长度
    SELECT substring(sql_temp from 5 for count) INTO sql_temp;       //截取字符串
    sql:= sql ||sql_temp;
          
              RETURN QUERY EXECUTE sql;
           END IF;
    END
    $BODY$
      LANGUAGE plpgsql VOLATILE;
    展开全文
  • postgresql 判断字段是否为空

    万次阅读 2017-12-06 15:33:23
    select COALESCE(tran.rm_amt,0) rm_amt select COALESCE(null, 0) as test 结果 test 0
  • postgreSql 判断表不存在而创建表

    千次阅读 2016-12-03 18:22:27
    create table if not exists bar_code  (   "barcodeEan" varchar(13) NOT NULL PRIMARY KEY,   "itemId" int NOT NULL  ...这个好像需要postgresql某些版本及以上的才支持
  • PostgreSQL判断表是否存在最快的方法

    万次阅读 2017-10-30 23:14:13
    1.使用to_regclass函数(首选方法)速度最快,9.4或更高版本首选这个函数if( to_regclass('test') is null ) then 你的代码 end if;或包含架构if( to_regclass('public.test') is null ) then /*你的代码*/ end if;2....
  • 项目中有遇到,做个简单记录 ...IF (SELECT COUNT(*) AS ct1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名' AND COLUMN_NAME = '字段名' ) = 0 --判断字段数量是不是0 THEN alter table 表名 add c...
  • PostgreSQL不等于判断

    千次阅读 2020-06-12 14:25:53
    操作必须加上OR column is NULL where id='1' and (name <> '123' or name is NULL)
  • postgresql——条件判断函数

    千次阅读 2019-11-17 09:44:16
    转载:... postgresql支持CASE,COALESCE,NULLIF,GREATEST,LEAST条件表达式,使用它们有时候可以简化许多功能实现。 测试表 test=# create table tbl_test(id int,name varchar(32),sex ...
  • 创建表后,有时需要对表进行 set not null 或者 set null 设置。 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) # # su - postgres $ $ psql -c "select version();" ...
  • 今天工作时写了一个sql,但是PostgreSQL总是提示有语法错误,简单的做个记录: 问题1、'' 和“”单引号和双引号 举个例子:   1 #1、select id, delivery_date, sal_plan_date from zaiko_shop where id=""; ...
  • Postgresql 9.4 判断表是否存在...

    千次阅读 2016-12-07 15:19:06
    就一函数:  SELECT to_regclass('tablename') is not null 不管是物理表还是临时表都有效. 若按条件查询表名,比如模糊查询.. select * from pg_tables where tablename like '%mail%'...
  • PostgreSQL

    2021-04-20 01:05:49
    PostgreSQL 本文章主要是对 PostgreSQL 有一个基本的了解,如想了解更多,请查看官方文档 : 直链 1. PostgreSQL概念说明 1.1 PostgreSQL 是什么 当你在看这篇文章的时候,应该是对 PostgreSQL 了解过的, 那么 什么...
  • [code="sql"] drop table if exists aaa;... id character(4) NOT NULL, key character varying(50) NOT NULL, value character varying(1024) NOT NULL, CONSTRAINT "AAA_pkey" PRI...
  • PostgreSQL

    2012-10-26 10:53:06
    PostgreSQL Commands QuickStart: [url]http://www.thegeekstuff.com/2009/04/15-practical-postgresql-database-adminstration-commands/[/url] [url]http://www.linuxweblog.com/postgresql-reference[/u...
  • oracle中,任何字符串与null比较得到的结果都是null,而 oracle的判断条件为null时就退出判断(?) 因此判断某个字符串是否在一个集合中时,not in 和 in的结果完全不一样,如 select * from airport_heliport t ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,294
精华内容 3,717
关键字:

nullpostgresql判断