ITPub博客

首页 > 数据库 > 国内数据库 > YashanDB condition语法

YashanDB condition语法

国内数据库 作者:崖山数据库系统YashanDB 时间:2025-04-01 17:47:22 0 删除 编辑

condition::=

语法图
代码
syntax
(NOTexprexpr<<=>>==<>!=ANYSOMEALLsubqueryexpr_listexprsubqueryexprNOTINexpr_listsubqueryexpr_listNOTINexpr_list,subqueryexprNOTLIKEexprexprNOTRLIKEexprNOTEXISTSsubqueryexprISNOTNULLexprNOTBETWEENexprANDexprrownum_clausestart_date1end_date1OVERLAPSstart_date2end_date2)ANDORcondition

expr及expr_list定义

condition为条件子句,被应用于WHERE、CHECK等需要进行条件判断的语法场景中,condition将返回TRUE或FALSE值。

YashanDB支持符合SQL标准的各类条件指定:

  • NOT

  • =|>|>=|<|<=|!=|<> [ANY|SOME|ALL]

  • IN|NOT IN

  • LIKE|NOT LIKE [ESCAPE]

  • RLIKE|NOT RLIKE

  • EXISTS|NOT EXISTS

  • IS NULL|IS NOT NULL

  • BETWEEN...AND...

  • ROWNUM

  • 能产生BOOLEAN值的任何表达式

#比较条件

通过比较符(=|>|>=|<|<=|!=|<>)对其左右两边的表达式进行比较,获得布尔结果。

#any|some

ANY|SOME语法从比较符(=|>|>=|<|<=|!=|<>)右边的集合中选出符合比较条件的子集,然后对左右两边逐一比较,只要获得一个TRUE值,则返回TRUE;全部为FALSE值时,返回FALSE;右边集合为子查询且为空时,返回FALSE。

右边的集合可以为表达式列表,或者子查询语句;对于不指定ANY|SOME的比较,比较符的右边只能为产生单行结果的表达式。

当比较符的左右任一边出现NULL时,均返回FALSE。

示例

--ANY与SOME效果相同SELECT branch_no,branch_nameFROM branchesWHERE branch_no < ANY('0303','0401');BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0001      深圳                                                         
0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门                                                         
0201      成都         
 
SELECT branch_no,branch_nameFROM branchesWHERE area_no <> SOME(SELECT area_no FROM area WHERE area_no IN ('01','02'));BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门                                                         
0401      北京                                                         
0402      天津                                                         
0403      大连                                                         
0404      沈阳                                                         
0201      成都                                                         
0502      长沙
Copied!

#all

ALL语法从比较符(=|>|>=|<|<=|!=|<>)右边的集合中选出符合比较条件的子集,然后对左右两边逐一比较,只要获得一个FALSE值,则返回FALSE;全部为TRUE值时,返回TRUE;右边集合为子查询且为空时,返回TRUE。

右边的集合可以为表达式列表,或者子查询语句;对于不指定ALL的比较,比较符的右边只能为产生单行结果的表达式。

当比较符的左右任一边出现NULL时,均返回FALSE;但对于 NULL > ALL(结果为空的集合),返回TRUE。

示例

SELECT branch_no,branch_nameFROM branchesWHERE branch_no != ALL('0001','0303','0401','0403');BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门                                                         
0201      成都0402      天津0404      沈阳                                                         
0502      长沙
Copied!

#in条件

IN语法将左边集合里的值与右边集合里的值逐一做相等比较,左边的值全部命中则返回TRUE,否则返回FALSE。

右边的集合可以为表达式列表,或者子查询语句;当左边为表达式列表时,右边必须为表达式列表的集合,子查询则返回的是对应列表列项的结果集。

示例(HEAP表)

--行存表SELECT branch_no,branch_nameFROM branches bWHERE (branch_no,area_no) IN(SELECT b.branch_no,area_no FROM area aWHERE a.area_no IN ('01','02')AND a.area_no=b.area_no);BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门                                                         
0201      成都
Copied!

Copied!

#like条件

LIKE语法需要指定匹配的字符表达式char1与模式串char2,通过匹配算法将字符表达式char1与模式char2做匹配,匹配成功则返回TRUE,匹配失败则返回FALSE。其完整语法形式为:

char1 [NOT] LIKE char2 [ESCAPE esc_char].

其中,char1 代表要匹配的字符表达式,char2代表要匹配的模式,esc_char代表escape字符。

LIKE语句执行如下规则:

  • char1,char2,和esc_char都可以是一个表达式,其结果可以是任何数据类型,当它们的数据类型不一致时,都将转为VARCHAR类型进行判断。

  • 当char1或者char2为NULL时,返回NULL。

  • char2可以包含特殊的模式匹配字符:下划线 (_) 表示与值中的一个字符完全匹配;百分比符号(%)表示可以匹配值中的零或多个字符(不包括空)。

  • escape用于转义特殊的模式匹配字符,即将%或_转变为本身的字面意思。如指定了escape,则char2中的esc_char后字符必须为%或_或esc_char自身,否则返回YAS-04428或YAS-04429错误。

  • esc_char后字符为esc_char自身,表示将其转变为本身的字面意思,如当esc_char为 /时,模式 //匹配的就是 /这个字符,但 ///中的第三个 /将作为转义符。

  • esc_char必须是长度1的字符,也可以是运算后变成长度为1的字符。

示例

--完全匹配SELECT branch_no,branch_nameFROM branchesWHERE branch_no||'11/1' LIKE '_1__11_1';BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门       
 
--转义后无数据满足条件SELECT branch_no,branch_nameFROM branchesWHERE branch_no||'11/1' LIKE '_1__11/_1' ESCAPE '/';BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------
 
 --改为本身字符查找,且去掉其后的_通配符后可以查找到数据SELECT branch_no,branch_nameFROM branchesWHERE branch_no||'11/1' LIKE '_1__11//1' ESCAPE '/';BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门
Copied!

#rlike条件

RLIKE语法实现功能与 REGEXP_LIKE函数相同,通过正则表达式匹配算法将字符表达式expr与正则表达式regexp做匹配,匹配成功返回TRUE,匹配失败返回FALSE。其完整语法形式为:

expr [NOT] RLIKE regexp.

RLIKE语句执行如下规则:

  • expr为要匹配的字符表达式,须为字符型,或可转换为字符型的其他类型。
  • regexp为要匹配的 RegExp,须为字符型,或可转换为字符型的其他类型,长度不超过512字节。
  • 当expr或者regexp为NULL时,返回NULL。

示例

SELECT branch_no,branch_nameFROM branchesWHERE branch_no RLIKE '01[0-9]+';BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0101      上海                                                         
0102      南京                                                         
0103      福州                                                         
0104      厦门
Copied!

#between and条件

BETWEEN  AND语法确定一个表达式的值是否在其他两个表达式定义的间隔内。在语句中出现的三个表达式都必须是数值型、字符型或日期时间型表达式,当三个表达式的数据类型不一致时,会先进行数据类型的转换,转换失败时返回错误。

示例

SELECT branch_no,branch_nameFROM branchesWHERE branch_no NOT BETWEEN '01' AND '05';BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0001      深圳                                                         
0501      武汉                                                         
0502      长沙
Copied!

#rownum_clause

ROWNUM是系统顺序分配的查询返回的行编号,返回的第一行分配的是1,第二行是2,依此类推。该语句通过ROWNUM伪列限制查询返回的总行数,具体使用规则 ROWNUM伪列。

示例(HEAP表)

SELECT * FROM branches WHERE ROWNUM != 3; -- 返回ROWNUM为1,2共2条记录SELECT * FROM branches WHERE ROWNUM != 1; -- 无记录返回SELECT * FROM branches WHERE ROWNUM >= 1; -- 返回全部记录SELECT * FROM branches WHERE ROWNUM > 1; -- 无记录返回SELECT * FROM branches WHERE ROWNUM < 5; -- 返回ROWNUM为1,2,3,4共4条记录SELECT * FROM branches WHERE ROWNUM <= 5; -- 返回ROWNUM为1,2,3,4,5共5条记录SELECT * FROM branches WHERE ROWNUM = 1; -- 返回ROWNUM为1共1条记录SELECT * FROM branches WHERE ROWNUM = 2; -- 无记录返回SELECT * FROM branches WHERE ROWNUM BETWEEN 1 AND 8;  -- 返回ROWNUM为1,2..8共8条记录SELECT * FROM branches WHERE ROWNUM BETWEEN 2 AND 8;  -- 无记录返回
 -- 将ROWNUM用于子查询中,获得前5名记录SELECT branch_no,branch_name FROM(SELECT ROWNUM AS rn, a.* FROM branches a ORDER BY branch_no DESC)WHERE rn<=5;BRANCH_NO BRANCH_NAME                                                     
--------- ----------------------------------------------------------------0104      厦门                                                          
0103      福州                                                          
0102      南京                                                          
0101      上海                                                          
0001      深圳
Copied!

#overlaps

OVERLAPS是专门用于比较时间日期区间是否有重叠的函数,当时间区间有交集时返回true,反之返回false。语法格式如下:

(start_date1, end_date1) OVERLAPS (start_date2, end_date2)

OVERLAPS函数执行遵循以下规则:

  • 表达式start_date1、end_date1、start_date2、end_date2不可缺省,可以输入null或空串。
  • 四个表达式的类型需要一致,并且参数类型为DATE、TIMESTAMP、TIME,其他类型则报错。
  • 返回类型为BOOL类型,输出结果为true或false。
  • 区间定义范围为开区间。
  • 当一侧区间定义全为null时会报错。

示例

-- 判断时间区间(2022-01-01, 2024-03-05)与区间(null, 2024-01-05)是否存在交集SELECT 1 FROM dual WHERE (TO_DATE('2022-01-01', 'YYYY-MM-DD'), TO_DATE('2024-03-05', 'YYYY-MM-DD')) overlaps (null, TO_DATE('2024-01-05', 'YYYY-MM-DD'));
           1 ------------ 
           1


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3079693/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据管理解决方案。

注册时间:2023-04-11

  • 博文量
    722
  • 访问量
    640016