写点什么

YashanDB condition 语法

作者:YashanDB
  • 2025-04-01
    广东
  • 本文字数:4687 字

    阅读完需:约 15 分钟


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。


示例



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!


示例(LSC 表、TAC 表)



SELECT branch_no,branch_nameFROM branches bWHERE SUBSTR(branch_no,1,2) IN ('01','02');BRANCH_NO BRANCH_NAME
0101 上海 0102 南京 0103 福州 0104 厦门 0201 成都
复制代码


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; SELECT * FROM branches WHERE ROWNUM != 1; SELECT * FROM branches WHERE ROWNUM >= 1; SELECT * FROM branches WHERE ROWNUM > 1; SELECT * FROM branches WHERE ROWNUM < 5; SELECT * FROM branches WHERE ROWNUM <= 5; SELECT * FROM branches WHERE ROWNUM = 1; SELECT * FROM branches WHERE ROWNUM = 2; SELECT * FROM branches WHERE ROWNUM BETWEEN 1 AND 8;  SELECT * FROM branches WHERE ROWNUM BETWEEN 2 AND 8;   
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 时会报错。


示例



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
复制代码


Copied!

发布于: 3 小时前阅读数: 8
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB condition语法_数据库_YashanDB_InfoQ写作社区