暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AntDB 数据库Oracle兼容 - 函数5

tocata 2024-08-19
71

其它类型函数

序列操作函数

本节介绍了 AntDB 中用于操作序列对象的函数。序列对象(也被称为序列产生器或者简称为序列)是一个特定的单行记录表,由 CREATE SEQUENCE 命令创建。一个序列对象通常为表的记录产生唯一标识。在下面列出的序列函数为从序列对象中获取连续的序列数提供了简单,多用户安全的方法。

sequence.NEXTVAL

sequence.CURRVAL

sequence 是在 CREATE SEQUENCE 命令中分配给序列的的标识符。下面介绍了这些函数的使用方法。

NEXTVAL

这个函数的作用是将序列对象的当前位置指到这个对象的下一个值。这个操作完成后是不能撤销的。即使多个会话同步执行 NEXTVAL,每个会话将只能安全的取得一个唯一的序列值。

CURRVAL

返回在当前会话中函数 NEXTVAL 在序列中最近取得的数值。(如果在会话中的序列从来没有调用 NEXTVAL,那么报告一条错误)。需要注意的是因为这个函数返回所在会话的序列数值,它会给出关于从当前会话开始的时候,是否有其他的会话执行了 NEXTVAL 的可预见性答案。

如果已经使缺省参数创建了一个序列对象,那么在这个对象上调用 NEXTVAL 函数将返回从 1 开始的连续数值。通过在 CREATE SEQUENCE 命令中使用特定参数,可以获取序列的其他系统行为。

重要注意事项:为避免从同一序列获取数值的同步事务阻塞,函数 NEXTVAL 操作永远不会回滚;这就是说,一旦获取了一个值,即使执行函数 NEXTVAL 的事务随后中断,也会认为已经使用了这个值。这就意味着中断的事务可能会在已经分配的值的序列留下未使用的值的“漏洞”。

具体使用参考 SQL 命令章节的 CREATE SEQUENCE 命令介绍。

字符集

名称参数 个数功能用例
NLS_CHARSET_ID1返回字符集名称参应 id 值,AntDB 的字符集 ID 值和 Name 与 Oracle 不同,这一点与 Oracle 不兼容。SELECT nls_charset_id('zhs16gbk') FROM dual;
NLS_CHARSET_NAME1根据字符 id 返回字符集名称,AntDB 的字符集 ID 值和 Name 与 Oracle 不同,这一点与 Oracle 不兼容。SELECT nls_charset_name(37) FROM dual;

条件函数

名称参数 个数功能举例
coalesce1~n参数中第一个非空值。只有当所有的参数都是空值的时候,才返回空值。
NULLIF2NULLIF(value1, value2) 如果 value1 和 value2 相等,返回空值,否则它返回 value1。
LNNVL1lnnvl(condition),参数是一个表达式,如果表达式为 true,则返回 false;表达式为 false,返回 true。LNNVL(commission_pct >= .2)
NANVL2nanvl(n1,n2),如果 n1 是 NaN 时,就返回 n2,否则返回 n1。NANVL(4.6,0)
NVL2NVL(c1,c2) ,从左向右,返回第一个不为空的参数。若两个参数都为空,返回 null。NVL(TO_CHAR(commission_pct), 'Not Applicable')
NVL23NVL2(c1,c2,c3),如果 c1 非空则返回 c2,如果 c1 为空则返回 c3。NVL2(commission, salary + commission, salary)
DECODE2ndecode(条件,值 1,返回值 1,值 2,返回值 2,值n,返回值 n,缺省值),如果条件=值 1,返回“返回值 1;如果条件=值 2,返回“返回值 2” ,依次类推,没有找到对应的值,则返回默认值。

在本节中介绍了在 AntDB 中允许使用的条件表达式。这些条件表达式都是遵从 SQL 标准。

CASE

SQL 语言的 CASE 表达式是一类条件表达式,与其它语言中 if/else 语句的功能类似:

CASE WHEN condition THEN result

[ WHEN ... ]

[ ELSE result ]

END

CASE 子句可以在表达式出现的任何地方使用。condition 是一个表达式,它的返回结果是 BOOLEAN 类型。如果返回结果为 true,那么CASE 表达式的值是在 condition 后面的 result。如果返回结果为 false,那么就会用相同的方式搜索 CASE 表达式后面的 WHEN 子句。如果 WHEN condition 的返回结果不为真,那么 CASE 表达式的值就是在 ELSE 子句中的 result。如果没有使用 ELSE 子句并且没有条件匹配,那么结果返回为空。

示例:

SELECT * FROM t1;

id
---
1
2
3
(3 rows)

SELECT id,
CASE WHEN id=1 THEN 'one'
WHEN id=2 THEN 'two'
ELSE 'other'
END
FROM t1;

id | case
---+-------
1 | one
2 | two
3 | other
(3 rows)

所有 result 表达式的数据类型必须能够转换成一个单一的输出类型。

下面这个简化的 CASE 表达式是上面普通类型表达式的另一种特定使用方式。

CASE expression

WHEN value THEN result

[ WHEN ... ]

[ ELSE result ]

END

首先计算 expression,然后和 WHEN 子句中所有指定的 value 进行了比较,直到找到了一个相等的条件。如果没有找到匹配条件,那么返回在 ELSE 子句中的 result(或者是一个空值)。

我们可以使用简化的 CASE 语法重新写上面的示例:

SELECT id,
CASE id WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM t1;

a | case
--+-------
1 | one
2 | two
3 | other
(3 rows)

CASE 表达式不计算那些不需要确认结果的子表达式。例如,下面是一个允许使用的方法,用来避免除零操作。

SELECT ... 	WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

COALESCE

函数 COALESCE 返回参数中第一个非空值。只有当所有的参数都是空值的时候,才返回空值。

语法:

COALESCE(value [, value2 ] ...)

当需要显示所取出来的值,我们通常使用缺省值来替代空值。

SELECT COALESCE(value1 , value2, default_value)…

和 CASE 表达式一样,COALESCE 不计算那些不需要决定结果的参数。这就是说,第一个非空参数右边的参数是不需要计算的。这个 SQL标准函数提供了与函数 NVL 和 IFNULL 类似的功能,可以在其他的数据库系统中使用。

示例:

CREATE TABLE t1(id int, math int,chinese int, english int);
INSERT into t1(id, math) values(1,88);
INSERT into t1(id, english) values(2,98);
INSERT into t1(id, chinese) values(3,97);
INSERT into t1(id) values(4);

SELECT COALESCE(math, chinese, english, 0) FROM t1;
COALESCE 
-------------------
       88
       98
       97
        0
(4 rows)

SELECT COALESCE(math, chinese, english) FROM t1; 
COALESCE 
------------------
       88
       98
       97
         
(4 rows)

NULLIF

如果 value1 和 value2 相等,函数 NULLIF 返回空值,否则返回 value1。

语法:

NULLIF(value1, value2)

示例:

CREATE TABLE test(id int, math int);
INSERT into test values(1,88),(2,89),(3,100),(4,99);
SELECT nullif(math, 100) FROM test;
 NULLIF 
----------------
     88
     89
       
     99
(4 rows)

LNNVL

LNNVL 函数判断条件中的一个或者两个操作数是否为 NULL。该函数可以在 WHERE 子句中使用,也可以作为 CASE 表达式中的 WHEN 条件。将条件作为参数,如果条件为 FALSE 或 UNKNOWN,则返回 TRUE;如果条件为 TRUE,则返回 FALSE。

语法:

LNNVL(condition)

示例:

-- test 表定义:
CREATE TABLE test(id int, math int);
INSERT into test values(1,88),(2,89),(3,100),(4,99);

SELECT lnnvl(math = 100) FROM test;
 LNNVL(MATH = 100)  
-----------------------------------
 t
 t
 f
 t
(4 rows)

NANVL

语法:

nanvl(n1,n2)

如果 n1 是 NaN 时,就返回 n2,否则返回 n1。要求 n1 和 n2 的类型都是 numeric 或者可以隐式转换成 numeric 的类型。

示例:

SELECT nanvl('NaN',-1) FROM dual;
NANVL('NAN',-1)  
-----------------------
            -1
(1 row)

SELECT nanvl(2,-1) FROM dual;
 NANVL(2,-1)  
---------------------
            2
(1 row)

NVL

NVL 函数从两个表达式返回一个非 NULL 值。如果 expr1 与 expr2 的结果皆为 NULL 值,则 NVL 函数返回 NULL。

语法:

NVL(expr1, expr2)

示例:

SELECT NVL(null, 1) FROM dual;
 NVL(NULL, 1)  
---------------
 1
(1 row)

SELECT NVL(2, null) FROM dual;
 NVL(2, NULL)  
---------------
 2
(1 row)

SELECT NVL(null, null) FROM dual;
 NVL(NULL, NULL)  
------------------
 
(1 row)

NVL2

NVL2 函数根据表达式是否为空,返回不同的值。如果 expr1 不为空,则返回 expr2的值,如果 expr1 为空,则返回 expr3 的值。expr2 和 expr3 类型不同的话,expr3 会转换为 expr1 的类型。

语法:

NVL2(expr1, expr2, expr3)

示例:

-- test表定义:
CREATE TABLE test(id int, math int);
INSERT into test values(1,88),(2,89),(3,100),(4,99);

SELECT math, NVL2(math, 'not null','is null') FROM test;
 MATH | NVL2(MATH, 'NOT NULL','IS NULL')  
------+-----------------------------------
   88 | not null
      | is null
      | is null
      | is null
(4 rows)

DECODE

语法:

decode(condition,x1, y1, x2, y2, x3,y3 [,xn, yn] ……, default_value)

该函数的含义如下:

IF condition=x1 THEN

RETURN(y1)

ELSIF condition=x2 THEN

RETURN(y2)

......

ELSIF condition=xn THEN

RETURN(yn)

ELSE

RETURN(default_value)

END IF

示例:

emp 表格定义见【示例参考表格】

SELECT EMPNO, decode(DEPTNO, 10, 1, 20, 2, 30,3, 0) FROM emp;
 EMPNO | DECODE(DEPTNO, 10, 1, 20, 2, 30,3, 0)  
-------+----------------------------------------
  7521 |                                      3
  7566 |                                      2
  7654 |                                      3
  7782 |                                      1
  7788 |                                      2
  7839 |                                      1
  7844 |                                      3
  7900 |                                      3
  7902 |                                      2
  7934 |                                      1
  7876 |                                      2
  7469 |                                      2
  7698 |                                      3
  7369 |                                      2
  7499 |                                      3
(15 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论