GreGreenPlum 和 GBase 都可以很好的支持 SELECT、UPDATE、DELETE 声明中的 WHERE 子句和 HAVING 子句。
GreenPlum和GBase支持的谓词比较多,详细的可以分为逻辑谓词、比较谓词、存在谓词、In谓词、NULL判断谓词、范围表达式和模式匹配谓词。
本篇主要从以上几个方面介绍GreenPlum谓词向GBase谓词的迁移。
1.1. 谓词的迁移
1.1.1. 综述
1.1.2. 逻辑谓词
逻辑谓词是结合两个条件,返回一个结果。GreenPlum有3个逻辑谓词,这些谓词相对通用,因此GBase 都有相同的谓词与之对应,在迁移时不用改变。
1.1.2.1. 表达式1 AND 表达式2
如果两个条件都返回 true 则此表达式返回 true 。如果有一个条件为 null 则返回 false 。
GBase替代: AND
1.1.2.2. NOT 表达式
否定表达式的结果,如果表达式为 false 则返回 true,如果表达式为 null 则返回 UNKNOWN 。
GBase替代: NOT
1.1.2.3. 表达式1 OR 表达式2
如果任意一个表达式结果为 true 则返回 true,如果一个表达式为 null 则返回 UNKNOWN 。
GBase替代: NOT
1.1.3. 比较谓词
比较谓词一般用于比较两个表达式,GreenPlum支持 8 个比较谓词。这些比较谓词是通用的,GBase有相同的谓词与之对应,迁移的时候可以不做改变。
1.1.3.1. 表达式1 = 表达式2
如果两个表达式是相等的,则返回 true ,如果有一个表达式为 null 则返回 NUKNOWN ,其余返回 false 。
GBase替代: =
1.1.3.2. 表达式1 <> 表达式2
额外的其他的格式(可能在别的平台使用): != ^= -|= 。 如果这两个条件不相同,返回 true,如果任意一个条件为 null 返回 UNKNOWN ,其余返回 false。
GBase替代: <> !=
1.1.3.3. 表达式1 < 表达式2
如果条件1 小于 条件 2 则返回 true ,有一个条件为空返回 UNKNOWN ,其余返回 false 。
GBase替代: <
1.1.3.4. 表达式1 <= 表达式2
如果条件1 小于或等于条件2 则返回 true ,如果其中一个为 null 则返回 UNKNOWN ,其余情况返回 false。
GBase替代: <=
1.1.3.5. 表达式1 > 表达式2
如果条件1 大于条件 2 则返回 true ,如果其中一个为 null 则返回 UNKMOWN ,其余情况返回 false 。
GBase替代: >
1.1.3.6. 表达式1 >= 表达式2
如果条件 1 大于或等于条件2 则返回 true ,如果其中一个为 null 则返回 UNKOWN ,其余情况返回 false 。
GBase替代:>=
1.1.3.7. 表达式1 比较运算符 ANY 表达式2
是表达式1 比较运算符 SOME 表达式2 的同义字。ANY关键词的意思是“对于在表达式2返回列中的任一值,如果比较结果为TRUE的话,则返回TRUE”,如果没有任何值与表达式1相比可以得到 true 那么返回 false 或返回空集。
比较运算符可以使用下面其中之一:= <> < <= > >=
GBase替代:ANY, SOME, 表达式2 需要是一个子查询
1.1.3.8. 表达式1比较运算符 ALL 表达式2
ALL 关键词的意思是“对于在表达式2返回列中的所有值,如果比较结果为TRUE的话,则返回TRUE”,如果没有任何值与表达式1相比可以得到 true 那么返回 false 或返回空集。
比较运算符可以使用下面其中之一:= <> < <= > >=
GBase替代:ALL, 表达式2 需要是一个子查询
1.1.4. 存在谓词
存在谓词匹配子查询中的行,GreenPlum支持两个存在谓词,这些存在谓词相对通用,迁移时不需要作任何改变。
1.1.4.1. EXISTS (子查询)
如果子查询中至少存在一行,则返回 true ,否则返回 false 。
GBase替代: EXISTS
1.1.4.2. NOT EXISTS (subquery)
如果子查询中不存在行,则返回 true ,否则返回 false 。
GBase替代:NOT EXISTS
1.1.5. In 谓词
IN 谓词测试任何一个值是否可以在集合中找到,相对通用,GreenPlum和GBase是一样的,迁移的时候不需要作任何改变。
1.1.5.1. 表达式 IN {值列表 | (子查询)}
如果这个表达式与值列表(或子查询的结果)中任意一个值相同,则返回 true 。任意一个为 NULL 则返回 UNKNOW 。其余返回 false 。
GBase替代:IN
1.1.5.2. 表达式 NOT IN {值列表 | (子查询)}
如果这个表达式与值列表(或子查询的结果)中没有一个值相同,则返回 true 。任意一个为 NULL 则返回 UNKNOW 。其余返回 false 。
GBase替代:NOT IN
1.1.6. Null判断谓词
Null 判断谓词用来测试 null 值,相对通用,GreenPlum和GBase均支持,迁移时不需要作任何改变。
1.1.6.1. 表达式 IS NULL
如果这个表达式的结果是 NULL 则返回 true ,否则返回 false 。
GBase 替代:表达式 IS NULL
1.1.6.2. 表达式 IS NOT NULL
如果这个表达式的结果不是 NULL 则返回 true ,否则返回 false 。
GBase 替代:表达式 IS NOT NULL
1.1.7. 模式匹配谓词
模式匹配谓词用来测试 一个值是否匹配一个指定的模式,GreenPlum提供了三种实现模式匹配的方法:传统SQL的LIKE操作符、SQL99新增的SIMILAR TO操作符、POSIX风格的正则表达式。
1.1.7.1. 字符串表达式 LIKE 模式 [ESCAPE 例外字符串]
如果字符串表达式匹配了模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用当前(输入)的字符集,为所有参数的字符集。
GBase 替代: LIKE
1.1.7.2. 字符串表达式 NOT LIKE 模式 [ESCAPE 例外字符串]
如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用当前(输入)的字符集,为所有参数的字符集。
GBase 替代: NOT LIKE
1.1.7.3. 字符串表达式 SIMILAR TO 模式 [ESCAPE 例外字符串]
如果字符串表达式匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 Unicode字符集,为所有参数的字符集。
SIMILAR TO和LIKE非常类似,只不过它使用SQL标准定义的正则表达式理解模式,具有LIKE的功能,此外还支持部分POSIX正则表达式进行模式匹配,例如:
(a)|表示选择(两个候选之一)
(b)*表示重复前面的项零次或更多次
(c)+表示重复前面的项一次货更多次
(d)?表示重复前面的项零次或一次
(e){m}表示重复前面的项正好m次
(f){m,}表示重复前面的项m或更多次
(g){m,n}表示重复前面的项至少m次,最多不超过n次
GBase 替代:REGEXP
1.1.7.4. 字符串表达式 NOT SIMILAR TO 模式 [ESCAPE 例外字符串]
如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 Unicode字符集,为所有参数的字符集。
GBase 替代:NOT(字符串表达式REGEXP 模式)
1.1.7.5. 字符串表达式 正则表达式
如果字符串表达式匹配正则表达式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false。
POSIX正则表达式提供了比LIKE和SIMILAR TO 操作符更强大的模式匹配的方法。许多 Unix 工具,比如egrep,sed,awk使用类似的模式匹配语言。
正则表达式是一个字符序列,它是定义一个字符串集合(一个正则集合 )的缩写。如果一个字符串是正则表达式描述的正则集合中的一员时,我们就说这个字符串匹配该正则表达式。不同于LIKE和SIMILAR TO,正则表达式可以匹配字符串里的任何位置,除非该正则表达式明确地锚定在字符串的开头或者结尾。
正则表达式用法非常灵活,通常还可以和其他函数(如字符串替换)配合使用。
例如:
select‘abc’~ ‘abc’返回真
select ‘abc’~ ‘^a’返回真
GBase 替代:REGEXP
1.1.8. 范围表达式
范围表达式测试在一个范围内包含的值,范围表达式相对通用,GreenPlum和GBase是一样的,迁移时不需要作任何修改。
1.1.8.1. 表达式1 BETWEEN表达式2 AND表达式3
如果表达式1 在指定的表达式值的范围内(例如如果表达式1 在表达式2的范围内或等于表达式2 且小于等于表达式3) 则返回 true ,如果有一个表达式是 null 则返回 UNKNOWN 其余返回false。
GBase 替代: BETWEEN
1.1.8.2. 表达式1 NOT BETWEEN表达式2 AND表达式3
如果表达式1 不在指定的表达式值的范围内则返回 true ,如果有一个表达式是 null 则返回 UNKNOWN 其余返回false。
GBase 替代: NOT BETWEEN
1.1.9. 谓词优先级
在同一条 SQL 语句中可能存在多个条件和谓词,处理这些条件和谓词数据库系统有相应的顺序。对于条件的执行顺序,遵守从高到低的原则。对于表达式遵循从左向右执行的顺序。括号可以提高表达式的执行权限。GreenPlum DB中圆括号内的表达式先于括号外的表达式执行。GBase 同样遵守这些规则。
下表从高到低的列出了 GreenPlum DB和 GBase 谓词的优先级。
GreenPlum DB | GBase |
SQL 操作 | SQL 操作 |
比较谓词 (= <> < <= > >=) | 比较谓词(= <> < <= > >=), IS [NOT] NULL, LIKE, [NOT] IN, REGEXP |
IS [NOT] NULL, LIKE, [NOT]BETWEEN, [NOT] IN, EXISTS,IS OF type | [NOT] BETWEEN |
NOT | NOT |
AND | AND |
OR | OR |