本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.15节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.15 启用其他排序和比较选项
Oracle SQL疑难解析
1.15.1 要解决的问题
文本数据由大、小写字母和句子(英文句子,指第一个字母大写,后续字母小写)组成,我们希望对之进行不区分大小写的比较、排序等操作。
1.15.2 解决方法
激活Oracle的语言比较逻辑,就能按人类的习惯来查询数据,摆脱大小写负担:
alter session set NLS_COMP='LINGUISTIC';
select first_name, last_name
from hr.employees
where last_name = 'smith';
FIRST_NAME LAST_NAME
-------------------- -------------------------
William SMITH
Lindsey Smith
本语句的查询结果是基于前面对SMITH的UPDATE操作的。如果你做练习,请不要忘了之前的UPDATE语句。
1.15.3 数据库如何工作
长期以来,人们在设计应用程序时,使用两种方法来适应Oracle对区分大小写的规定。一种方法是在应用程序逻辑中确保在数据库中保存的数据都遵循一致的原则,如我们在HR.EMPLOYEE表中看到的首字母大写原则。另一种方法是数据在数据库中另存为用户希望的形式,但在数据库和应用程序逻辑中来确保小写的差异不会体现出来。
以前这颇费周折,但现在可以轻松地实现。下面的语句不会返回任何行,因为HR.EMPLOYEES表中没有任何LAST_NAME字段值是纯小写的。
Select first_name, last_name
From hr.employees
Where last_name = 'smith';
no rows selected
但用了我们的小窍门,通过对会话的环境变量的设置,引导Oracle用自然语言的方式进行比较,虽然表中都是这种形式的Smith而非全小写,但NLS_COMP环境标量可以控制Oracle对字符的比较方式,设置为LINGUISTIC,可以用自然语言的方式比较,符合人类的思维习惯。