数值

这部分主要介绍在InCloud ZNBASE中使用的数值,包括数字,字符串,数字,十六进制值,布尔值和NULL。

数字

整数

整数被表示为一个数字序列。整数可以前置一个负号“-”表示一个负数。有效整数的示例:128,0,-16。

浮点数

浮点数使用“.”作为一个十进制数字的分隔符。浮点数可以前置一个负号“-”表示一个负数。有效浮点数的示例:-123.456,-1.2800E+15。

十六进制值

InCloud ZNBASE支持十六进制数值,在数字的上下文语境中,它们作为数值等价于数值。

在字符串的上下文语境中,它们作为一个字符串,每一组十六进制数字被解释为对应 ASCII 码的字符。

示例1:0xf等价于15。

SELECT 0xf+2 AS sum;

sum

+——-+

17

示例2:将“44524442”转换成ASCII码字段“ZNBASE”。 表达式“x’hexstring’”是基于标准SQL。

SELECT x’44524442’ AS name;

name

+———+

ZNBASE

示例3:使用to_hex()函数可以将一个字符串或者数值转换为一个十六进制格式的字符串。

SELECT to_hex(‘InCloud ZNBASE’) AS hex;

hex

+—————————————+

496e436c6f75642044524442

SELECT to_hex(15) AS hex;

hex

+——-+

f

SELECT to_hex(0xe) AS hex;

hex

+——-+

e

布尔值

在InCloud ZNBASE中,常量TRUE和FALSE分别对应逻辑的真和假,常量的名字大小写不敏感。

示例1:查询TRUE和FALSE对应的值。

SELECT TRUE, true, FALSE, false;

bool | bool | bool | bool

+———+———+———-+———-+

true | true | false | false

字符串

​ 字符串是由多个字符组成的一个字符序列,由单引号“’”包围,例如,’Hello,ZNBASE’。InCloudZNBASE支持两种类型的字符串:标准字符串和带有C转义符的字符串。这两种类型都可以将任意Unicode字符编码为UTF-8。

在任何情况下,字符串的实际类型都是在出现的上下文中确定的。例如:

表达式字符串的实际数据类型
length(‘ZNBase’)STRING
now() + ‘3 day’INTERVAL
INSERT INTO tb(date_col) VALUES (‘2013-01-02’)DATE

要在字符串中使用单引号,需要使用两个单引号。

为了与SQL标准兼容,InCloudZNBASE支持:由换行符分割的两个简单字符串会自动连接在一起从而形成一个常量。

转义符

​ InCloud ZNBASE支持像C语言一样在字符串中包含转义字符。带有转义字符的字符串需要在字符串前面加上e作为前缀来表示。例如e’Hello,\n ZNBASE’。

InCloud ZNBASE支持的转义符如下表所示:

转义字符描述ASCII码值(十进制)
\a响铃(BEL)007
\b退格(BS)008
\t水平制表(HT)009
\n换行(LF)010
\v垂直制表(VT)011
\f换页(FF)012
\r回车(CR)013
\xHH十六进制字节值-
\ooo八进制字节值-
\uXXXX16位十六进制Unicode字符值-
\Uxxxxxxxx32位十六进制Unicode字符值-

示例1:标准字符串

SELECT ‘hello’ AS c1, ‘it’’s a pretty day! ‘ AS c2;

c1 | c2

+———-+——————————-+

hello | it’s a pretty day!

示例2:由换行符分割的两个简单字符串会自动连接在一起从而形成一个常量。

SELECT ‘hello, ‘ -> ‘InCloud ‘ -> ‘ZNBASE! ‘ AS c1;

c1

+———————————-+

hello, InCloud ZNBASE!

注意:仅当多个简单的文字用换行符分隔时,此特殊语法才有效。

示例3:用十六进制、8进制和16位十六禁止Unicode字符值,等价表示字符串’aaa’,并且使用了水平制表和换行。

SELECT e’\x61\t\141\n\u0061’ AS c1;

c1

+———-+

a a a

BIT数组

​ BIT数组由B前缀和用单引号包围的一串二进制数字组成,例如B’110’。如果期望值的类型是BIT(N)或者VARBIT(BITVARYING),可以传入BIT数组。BIT数组的位数可以是任意的,不必是8的倍数,也可以超过64。

​ 空BIT数组表示为B’’。BIT(N)类型的字段,能且只能接收长度为N的BIT数组,否则会报not match type的错误。VARBIT没有最大长度,VARBIT(N)最大长度为N。

示例1:VARBIT类型字段接收BIT数组。

CREATE TABLE t3(id INT PRIMARY KEY, ba VARBIT);

CREATE TABLE

INSERT INTO t3 VALUES (1,B’110’);

INSERT 1

INSERT INTO t3 VALUES (2,B’110’);

INSERT 1

INSERT INTO t3 VALUES (3,B’’);

INSERT 1

SELECT * FROM t3;

id | ba

+——+——-+

1 | 110

2 | 110

3 |

示例2:BIT(N)类型的字段只能接收长度为N的BIT数组。BIT长度为1。

CREATE TABLE t2(id INT PRIMARY KEY,ba BIT);

CREATE TABLE

INSERT INTO t2 VALUES (1,B’1’);

INSERT 1

SELECT * FROM t2;

id | ba

+——+——+

1 | 1

CREATE TABLE t5(id INT PRIMARY KEY,ba BIT(6));

CREATE TABLE

INSERT INTO t5 VALUES (1,B’10’);

pq: bit string length 2 does not match type BIT(6)

INSERT INTO t5 VALUES (1,B’110110’);

INSERT 1

SELECT * FROM t5;

id | ba

+——+————+

1 | 110110

BYTE数组

​ InCloud ZNBASE支持两种格式的BYTE数组:包含C转义字符的BYTE数组和十六进制编码的BYTE数组。

​ 带字符转义的BYTE数组使用方法与带转义字符的字符串相同,只是BYTE数组使用b前缀而字符串使用e前缀。对任何转义字符的解释都与字符串一样。例如b’hello,w\x6frld’。

​ BYTE数组和带转义字符的字符串之间存在如下两个区别:

  • BYTE数组的数据类型总是BYTES,而字符串的数据类型取决于上下文。

  • BYTE数组可能包含无效UTF-8字节序列,而字符串必须包含有效的UTF-8序列。

​ 字节数组文字总具有BYTES数据类型,而字符串文字的数据类型取决于上下文。字节数组文字可能包含无效的UTF-8字节序列,而字符串文字必须始终包含有效的UTF-8序列。

​ 十六进制编码的BYTE数组是InCloud ZNBASE特有的扩展:定界符“x’”和“’”(或者“X’”和“’”)之间是任意的十六进制数字序列。

示例1:BYTE数组,b’ZNBASE’和x’44524442’以及X’44524442’是等效的。

SELECT b’ZNBASE’ AS c1;

c1

+———+

ZNBASE

SELECT x’44524442’ AS c1;

c1

+———+

ZNBASE

SELECT X’44524442’ AS c1;

c1

+———+

ZNBASE

示例2:BYTE数组的数据类型总是BYTES。

CREATE TABLE t1(id INT PRIMARY KEY, bs BYTES);

CREATE TABLE

INSERT INTO t1 VALUES (1,b’ZNBASE’), (2,x’44524442’), (3,X’44524442’);

INSERT 3

SELECT * FROM t1;

id | bs

+——+———+ 1

1 | ZNBASE

2 | ZNBASE

3 | ZNBASE

解释性文字

任意数据类型的常量可以通过以下两种方式之一生成:

  • typestring

​ 例如 DATE’2019-11-11’,可以将字符串“’2019-11-11’”转换为DATE类型的内容“2019-11-12 00:00:00+00:00”。

  • ‘string’:::type

​ 例如,’2019-11-11’:::DATE,可以将字符串“’2019-11-11’”转换为DATE类型的内容“2019-11-12 00:00:00+00:00”。

字符串部分的值用作转换函数到指定数据类型的输入,转换函数的结果用作该数据类型的常量。

示例1:DATE类型

SELECT DATE ‘2019-11-11’;

date

+—————————————-+

2019-11-11 00:00:00+00:00

select ‘2019-11-11’:::DATE;

date

+—————————————-+

2019-11-11 00:00:00+00:00

select ‘2019-11-11’::DATE;

date

+—————————————-+

2019-11-11 00:00:00+00:00

SELECT CAST(‘2019-11-11’ AS DATE);

date

+—————————————-+

2019-11-11 00:00:00+00:00

示例2:BOOL类型

SELECT BOOL ‘true’;

bool

+———+

true

NULL

NULL是表示“无值”的特殊SQL符号。

NULL 不区分大小写。

NULL有以下两点需要注意:

  • NULL是任何类型的有效常数,其实际数据类型是在表达式求值期间,根据上下文确定的。

  • NULL 值不同于数字类型的 0 或字符串类型的空串。