kingbase ES 关于NULL及其相关函数
文章概要:
本文对主要就NULL值及其相关处理函数进行讨论,同时也介绍了ora_input_emptystr_isnull参数
一,关于NULL值
1,sql中的null值
null 值代表未知数据,或者说不确定的值,它与空字符串、0 是不一样的
null 值的处理方式与其他值不同, NULL与任何值进行计算结果也是NULL,比如 =、< 或 <>。
判断值是否为NULL 必须使用 IS NULL 或 IS NOT NULL 进行判断。
注意:空值('')表示长度为0的字符串,和NULL是不同的值。
2,各种数据库中常见的NULL值相关的判断函数
(部分数据库产品相关NULL值相关函数可能未完全列举)
sqlserver:
1.isnull( expr1 , expr2 )函数:
--如果expr1是null,返回expr2,否则返回expr1。
2.nullif(expr1,expr2)
--如果expr1= expr2 成立,那么返回值为null,否则返回值为expr1。
mysql:
1.isnull(exper)
-- 判断exper是否为空,是则返回1,否则返回0
2.ifnull(expr1,expr2)
--如果expr1的值为null,那么函数返回expr2的值,否则就返回expr1的值。
3.nullif(expr1,expr2)
-- 如果expr1= expr2 成立,那么返回值为null,否则返回值为expr1。
oracle:
1.nvl(expr1,expr2)
--如果expr1的值为null,那么函数返回expr2的值,否则就返回expr1的值。
2.nvl2(expr1,expr2,expr3)
--如果expr1的值为null,那么函数返回expr3,否则函数返回expr2。
3.nullif(expr1,expr2)
--如果expr1= expr2 成立,那么返回值为null,否则返回值为expr1。
kes:
1.nvl(expr1,expr2)
--同oracle
2.nvl2(expr1,expr2,expr3)
--同oracle
3.nullif(expr1,expr2)
--同oracle
4.ifnull(expr1,expr2)
--同mysql
5.isnull(exper)
--等价于sqlserver的isnull函数和kes中的nvl函数
6.isnull( expr1 , expr2 )函数:
--同sqlsevrer
3,通用的COALESCE函数
COALESCE函数是标准的SQL函数,被许多数据库系统支持。如MySQL、PostgreSQL、SQL Server、Oracle均支持
COALESCE函数是SQL中的一个非常实用的函数,它可以用于返回一系列参数中的第一个非空值。
如果所有参数都为NULL,COALESCE函数将返回NULL。
语法:
COALESCE(value1, value2, ..., valueN)
其中,value1、value2等为要检查的值,可以是列名、表达式或常量。函数会从左到右检查这些值,返回第一个非空值。
二,一个NULL值处理的案例
【问题描述】
SELECT..INTO..语句查询无结果时,抛出异常NO_DATA_FOUND(客户希望此情况获取NULL值,后续代码继续执行),导致后续的语句无法继续执行
【问题原因】
此情况V8默认抛出异常NO_DATA_FOUND的,内部有comp_v7_select_into_strict_attr可以兼容V7的行为,也可以改写的方式实现。
【解决方案】
1,需要配置兼容参数
1),set comp_v7_select_into_strict_attr=on;(session级)
2),在kingbase.conf中配置,comp_v7_select_into_strict_attr=on(all session)
2,如果项目版本不支持comp_v7_select_into_strict_attr参数,可以考虑使用nvl函数转null结果:
--转换前的语句
Select name INTO var_name from test WHERE id = 1;
--nvl函数改写
Select nvl(name,null) INTO var_name from test WHERE id = 1;
【解决方案验证】
comp_v7_select_into_strict_attr参数的验证
--创建测试函数
create table test(id int,name varchar(20));
insert into test values(2,'mwh');
select * from test;
CREATE OR REPLACE FUNCTION public.test_fun()
RETURNS character varying
AS
DECLARE
var_name name;
var_name2 name;
begin
Select name INTO var_name from test WHERE id = 1; ---查询结果为空,会抛出异常
raise notice '-1--->var_name:%',var_name;
Select name INTO var_name2 from test WHERE id = 2; ---存在该值
raise notice '-1--->var_name2:%',var_name2;
RETURN 'ok';
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise notice '-2--->var_name:%',var_name;
raise notice '-2--->var_name2:%',var_name2;
RETURN 'error';
end;
---设置comp_v7_select_into_strict_attr之前
test=# select test_fun();
test-# /
NOTICE: -2--->var_name:<NULL>
NOTICE: -2--->var_name2:<NULL>
test_fun
----------
(1 row)
---设置comp_v7_select_into_strict_attr为on之后
test=# set comp_v7_select_into_strict_attr=on;
test-# /
SET
test=# select test_fun();
test-# /
NOTICE: -1--->var_name:<NULL>
NOTICE: -1--->var_name2:mwh
test_fun
----------
mwh
(1 row)
使用nvl函数改写验证:
---创建测试函数
CREATE OR REPLACE FUNCTION public.test_fun1()
RETURNS character varying
AS
DECLARE
var_name1 name;
var_name2 name;
begin
Select nvl(name,null) INTO var_name1 from test WHERE id = 2;
raise notice '-1--->var_name1:%',var_name1;
Select nvl(name,null) INTO var_name2 from test WHERE id = 1;
raise notice '-1--->var_name2:%',var_name2;
RETURN 'ok';
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise notice '-2--->var_name1:%',var_name1;
raise notice '-2--->var_name2:%',var_name2;
RETURN 'error';
end;
--测试验证
test=# select test_fun1();
test-# /
NOTICE: -1--->var_name1:mwh
NOTICE: -2--->var_name2:<NULL>
test_fun1
-----------
(1 row)
三,关于ora_input_emptystr_isnull参数
对于oracle,默认的行为就是将''直接转化为NULL插入表中
CREATE TABLE test_null(id int, info varchar(32) DEFAULT '');
INSERT INTO test_null(id) values(1);
INSERT INTO test_null values(2, '');
INSERT INTO test_null values(3, NULL );
INSERT INTO test_null values(4, 'test');
执行查询语句:
select * from test_null;
结果如下:
1 null
2 null
3 null
4 test
而ora_input_emptystr_isnull 参数就是起兼容oracle行为的作用。位于data/kingbase.conf配置文件中,默认为true,既当输入的为空字符串’’时,是否转换为null(true则转化,否则不转化)。
test=# SHOW ora_input_emptystr_isnull;
test-# /
ora_input_emptystr_isnull
---------------------------
on
(1 row)
依然执行建表操作,并分别使用null和''进行查询,结果如下(oracle也是如此)
CREATE TABLE test_null(id int, info varchar(32) DEFAULT '');
INSERT INTO test_null(id) values(1);
INSERT INTO test_null values(2, '');
INSERT INTO test_null values(3, NULL );
INSERT INTO test_null values(4, 'test');
test=# select * from test_null where info is null; --显然,id
test-# /
id | info
----+------
1 |
2 |
3 |
(3 rows)
test=# select * from test_null where info = '';
test-# /
id | info
----+------
(0 rows)
将参数ora_input_emptystr_isnull设置为off,再次进行建表测试,显然行为已变,''不再等价于NULL。
test=# set ora_input_emptystr_isnull to off;
test-# /
SET
drop table test_null;
CREATE TABLE test_null(id int, info varchar(32) DEFAULT '');
INSERT INTO test_null(id) values(1);
INSERT INTO test_null values(2, '');
INSERT INTO test_null values(3, NULL );
INSERT INTO test_null values(4, 'test');
test=# select * from test_null where info is null;
test-# /
id | info
----+------
3 |
(1 row)
test=# select * from test_null where info ='';
test-# /
id | info
----+------
1 |
2 |
(2 rows)
test=#
四,KES中手动实现ISNULL函数
使用基础函数COALESCE函数来实现,考虑到和KES内置的isnull冲突,命令为isnull2编写验证
CREATE FUNCTION sys.isnull2(text,text) RETURNS text AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(text,text) TO PUBLIC;
CREATE FUNCTION sys.isnull2(boolean,boolean) RETURNS boolean AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(boolean,boolean) TO PUBLIC;
CREATE FUNCTION sys.isnull2(smallint,smallint) RETURNS smallint AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(smallint,smallint) TO PUBLIC;
CREATE FUNCTION sys.isnull2(integer,integer) RETURNS integer AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(integer,integer) TO PUBLIC;
CREATE FUNCTION sys.isnull2(bigint,bigint) RETURNS bigint AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(bigint,bigint) TO PUBLIC;
CREATE FUNCTION sys.isnull2(real,real) RETURNS real AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(real,real) TO PUBLIC;
CREATE FUNCTION sys.isnull2(double precision, double precision) RETURNS double precision AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(double precision, double precision) TO PUBLIC;
CREATE FUNCTION sys.isnull2(numeric,numeric) RETURNS numeric AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(numeric,numeric) TO PUBLIC;
CREATE FUNCTION sys.isnull2(date, date) RETURNS date AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(date,date) TO PUBLIC;
CREATE FUNCTION sys.isnull2(timestamp,timestamp) RETURNS timestamp AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(timestamp,timestamp) TO PUBLIC;
CREATE FUNCTION sys.isnull2(timestamp with time zone,timestamp with time zone) RETURNS timestamp with time zone AS $$
SELECT COALESCE($1,$2);
$$
LANGUAGE SQL STABLE;
GRANT EXECUTE ON FUNCTION sys.isnull2(timestamp with time zone,timestamp with time zone) TO PUBLIC;
kingbase ES 关于NULL及其相关函数的更多相关文章
- 在Java中,return null 是否安全, 为什么?
Java代码中return value 为null 是不是在任何情况下都可以,为什么不会throw NullPointerException? Java语言层面:null值自身是不会引起任何问题的.它 ...
- Kingbase重新数据初始化,设置大小写
KingbaseV8数据库安装完成后,删除/opt/Kingbase/ES/V8/data下所有内容,重新在其他目录初始化数据库,设置为忽略大小写 [kingbase@dbserver bin]$ . ...
- Kingbase V8R6集群安装部署案例---脚本在线一键缩容
案例说明: KingbaseES V8R6支持图形化方式在线缩容,但是在一些生产环境,在服务器不支持图形化界面的情况下 ,只能通过脚本命令行的方式执行集群的部署或在线缩容. Tips: Kingb ...
- Kingbase V8R6集群安装部署案例---脚本在线一键扩容
案例说明: KingbaseES V8R6支持图形化方式在线扩容,但是在一些生产环境,在服务器不支持图形化界面的情况下 ,只能通过脚本命令行的方式执行集群的部署或在线扩容. Tips: Kingbas ...
- KingbaseES V8R6C6备份恢复案例之---单实例sys_baackup.sh备份
案例说明: KingbaseES V8R6C6中sys_backup.sh在通用机单实例环境,默认需要通过securecmdd工具以及kingbase和root用户之间的ssh互信,执行备份初始化(i ...
- KFS replicator安装(KES-KES)
源端 一.安装前置配置 1.创建安装用户 groupadd flysync useradd flysync -g flysync -G kingbase passwd flysync 2.上传安装文件 ...
- Sys_Bulkload 工具使用
一.介绍 sys_bulkload是KingbaseES提供的快速加载数据的命令行工具.用户使用sys_bulkload工具能够把一定格式的文本数据简单.快速的加载到KingbaseES数据库中,或将 ...
- WinForm 对Web Api 增 册 改 查 的基本操作
WebApi代码: public class ValuesController : ApiController { Entities db=new Entities(); // GET api/val ...
- Winform简单调用WebApi
WebAPI Controllers public class SimuController : ApiController { //EF 5 BIM_GENERALDICTONARY_DBEnti ...
- Rocky4.2下安装金仓v7数据库(KingbaseES)
1.准备操作系统 1.1 系统登录界面 1.2 操作系统版本信息 jdbh:~ # uname -ra Linux jdbh -x86_64 # SMP Fri Dec :: CST x86_64 G ...
随机推荐
- Neutron详解
一:简介 一.概述 1. 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和删除网络 ...
- MySQL案例-并行复制乱序提交引起的同步异常
现象描述 Slave在开启并行复制后, 默认会乱序提交事务, 可能会引起同步中断; Slave端表现为同步的SQL线程抛出异常, 为主键重复, 修改的数据行不存在等; GTID信息类似于: 9a2a5 ...
- 腾讯云轻量级主机修改hostname后重启后又恢复原先的hostname
搭建k8s后,执行inspect后 显示hostname 不符合规范, 修改/etc/hostname 后重启, 发现又自动恢复到默认主机名: 查资料后发现腾讯云的配置里,如果重启会重置hostnam ...
- [攻防世界][江苏工匠杯]file_include
打开靶机url,上来就是代码审计 <?php highlight_file(__FILE__); include("./check.php"); if(isset($_GET ...
- 2021-06-28 CSS变量设置颜色
说明 css变量只能以[–]开头. 距离当前dom元素层级最近的父元素作用域css变量的值更容易生效. css变量在css文件中只能以var()函数来使用. 代码 <!DOCTYPE html& ...
- MySQL单表能存储多少条数据?
MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,甚至对它产生误解.MySQL单表的上限,主要与操作系统支持的最大文件大小有关.事实上MySQL能承受的 ...
- 【ACM专项练习#03】打印图形、栈的合法性、链表操作、dp实例
运营商活动 题目描述 小明每天的话费是1元,运营商做活动,手机每充值K元就可以获赠1元,一开始小明充值M元,问最多可以用多少天? 注意赠送的话费也可以参与到奖励规则中 输入 输入包括多个测试实例.每个 ...
- 【华为机试ACM基础#01】字符串最后一个单词长度、计算某字符出现次数、提取不重复的整数(熟悉字符/字符串/整数的输入)
字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000.(注:字符串末尾不以空格为结尾) 输入描述: 输入一行,代表要计算的字符串,非空,长度小于5000 ...
- PicGo如何设置阿里云图床
打开阿里云官网.注册并且登录.然后产品下拉列表里面通过搜索或者直接找到存储.对象存储OSS 默认你已经激活了,然后进入到控制台里面. 注意事项 Bucket名称需要全英文,不能有大写字母 服务器选国内 ...
- JS笔记:方法两次调用,执行不同分支(公共变量,闭包,类三种方法实现)
好家伙, 当我们对一个方法进行两次调用,我们希望第一次执行A分支,第二次执行B分支,该怎么做? 这意味着在连续的两次调用中,方法的执行逻辑会交替执行不同的分支. 方法一:公共变量 let flag ...