达梦数据库在大小写不敏感的情况下,如何使查询比较中依旧可以做大小写敏感比较?
新版达梦增强对大小写敏感比较功能,就算当前数据库已经是大小写不敏感,在SQL查询比较中依旧可以做大小写敏感比较。方法如下:
方法1:设置会话属性
字符的局部大小写敏感可以通过设置会话属性进行。
语法格式
ALTER SESSION SET CASE_SENSITIVE=<属性>;
<属性>:= DEFAULT | TRUE | FALSE
<属性> 设置为 DEFAULT 时,代表会话与当前数据库的大小写敏感属性保持一致;设置为 TRUE 时,代表在大小写不敏感的库上可以使得会话中的字符类型数据以大小写敏感的方式进行比较,而在大小写敏感的库上则维持原始方式比较;设置为 FALSE 时,代表在大小写敏感的库上可以使得会话中的字符类型数据以大小写不敏感的方式进行比较,而在大小写不敏感的库上则维持原始方式比较。
使用说明
1. 仅当前会话有效。
2. 仅对字符类型生效,其他数据类型忽略该会话属性。
3. 创建索引时忽略该会话属性。
4. 确定性函数参数忽略该会话属性。
5. CONTAINS 表达式忽略该会话属性。
6. ALL/SOME/ANY 子查询忽略该会话属性。
7. 层次查询表达式忽略该会话属性。
8. 集函数参数包括 WITHIN GROUP 中排序表达式时忽略该会话属性。
9. 分析函数参数包括 OVER 中排序表达式、分组表达式时忽略该会话属性。
10. 该会话属性优先级低于 BINARY 前缀,即存在 BINARY 前缀时,即使会话属性被设
置为 FALSE,仍会按照大小写敏感进行比较。
举例说明
设置当前会话为大小写敏感的方式。
ALTER SESSION SET CASE_SENSITIVE = TRUE
方法2:使用BINARY 前缀
局部大小写敏感的字符比较操作,提供 BINARY 前缀方式用于设置表达式比较时为大小写敏感。
BINARY 前缀支持范围:
1. SQL 项:查询项、过滤条件、连接条件、层次查询条件、having 条件、排序项、分组项。
2. 表达式类型:逻辑比较表达式、模糊查询表达式(包括 row like)、查询表达式(例如:in、逻辑比较,但不支持多列 in、多列逻辑比较)等。 BINARY 前缀在顶层查询项的含义是将查询项转换为原始值字符串 ASCII 码的十六进制形式,例如:将 123abc 转换为 0x313233616263;在除顶层查询项外的其他位置则表示该前缀修饰的表达式将按照大小写敏感进行比较,无论当前数据库为大小写敏感或不敏感。)
使用说明
1. 仅对字符类型生效,其他数据类型忽略 BINARY 前缀。
2. 多列比较不支持 BINARY 前缀,例如多列逻辑比较,多列 IN LIST 等。
3. 创建索引时忽略 BIANRY 前缀。
4. 确定性函数参数忽略 BINARY 前缀。
5. CONTAINS 表达式忽略 BINARY 前缀。
6. ALL/SOME/ANY 子查询忽略 BINARY 前缀。
7. 层次查询表达式忽略 BINARY 前缀。
8. 集函数参数包括 WITHIN GROUP 中排序表达式忽略 BINARY 前缀。
9. 分析函数参数包括 OVER 中的排序表达式、分组表达式忽略 BINARY 前缀
举例说明 :
在数据库初始化为大小写不敏感的情况下(即参数 CASE_SENSITIVE=0),执行查询语句,其中只有一条 and 子句添加 BINARY 前缀(即C2列按照大小 写敏感比较,C1、C3按照大小写不敏感比较)。
SELECT C1,C2,C3 FROM BT WHERE C1 = 'a' AND BINARY C2 = 'b' AND C3 = 'c';
具体内容请参考《DM8 SQL语言使用手册》第3章3.15.5小节和第4章4.16小节。