• 首先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
INSERT 0 1
hank=> select * from tab1 where b <>'hank';
a |    b
---+----------
(1 row)
可见b为null的值是不被筛选的
hank=> insert into tab1 values(1,'');
INSERT 0 1
hank=> select * from tab1 where b <>'hank';
a |    b
---+----------
1 |
''是可以被筛选的
要想达到效果，可以用如下写法
select * from tab1 where b <>'hank' or b is null;
a |    b
---+----------
1 |
1 |
(3 rows)
hank=> select * from tab1 where coalesce(b,'0')<>'hank';
a |    b
---+----------
1 |
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 |
hank=> select ctid,* from tab1 where b <>'hank' or b is null order by b nulls last;
ctid  | a |    b
-------+---+----------
(0,4) | 1 |
(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;


展开全文
• ## postgreSQL 的NULL

千次阅读 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;
展开全文
• select COALESCE(tran.rm_amt,0) rm_amt select COALESCE(null, 0) as test 结果 test 0
• create table if not exists bar_code  (   "barcodeEan" varchar(13) NOT NULL PRIMARY KEY,   "itemId" int NOT NULL  ...这个好像需要postgresql某些版本及以上的才支持
• 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支持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=""; ...
• 就一函数:  SELECT to_regclass('tablename') is not null 不管是物理表还是临时表都有效. 若按条件查询表名,比如模糊查询.. select * from pg_tables where tablename like '%mail%'...
• 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 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 ...

...