如何在 oracle sql 数据库中使 WHERE 子句不区分大小写?

Posted

技术标签:

【中文标题】如何在 oracle sql 数据库中使 WHERE 子句不区分大小写?【英文标题】:How to make WHERE clause case insensitive in oracle sql database? 【发布时间】:2020-06-12 16:34:32 【问题描述】:
select * from table_Name where name ="red"

我需要同时获取“red”和“RED”。

例如:我需要在同一语句中同时使用 upperlower

我该怎么做?

【问题讨论】:

【参考方案1】:

您可以在会话'NLS_SORT=BINARY_CI' 中使用不区分大小写 参数。会话级别有两个参数:

NLS_COMP NLS_SORT

让我们看一个演示:

正常情况:

SQL> with names as
    (
     select 'Vishnu' name from dual
    )
    -- Your query starts here
    select * from names where name='vIsHnU';

no rows selected

不区分大小写的方法:

SQL> alter session set nls_comp='LINGUISTIC';

Session altered

SQL> alter session set nls_sort='BINARY_CI';

Session altered

SQL> with names as
    (
     select 'Vishnu' name from dual
    )
    -- Your query starts here
    select * from names where name='vIsHnU';

NAME  
------
Vishnu

再举一个例子:

SQL> with names as
    (
     select 'red' name from dual union all
     select 'RED' from dual
    )
    -- Your query starts here
    select * from names where name='rEd';

NAME
----
red
RED

提高性能,您还可以创建一个不区分大小写 INDEX

例如:

create index names_ci_indx on names(NLSSORT(name,'NLS_SORT=BINARY_CI'));

现在,有一些方法可以提高上述事务的性能。请阅读Oracle – Case Insensitive Sorts & Compares

【讨论】:

更改会话集 nls_comp='LINGUISTIC'; alter session set nls_sort='BINARY_CI';添加了这两个..解决了这个问题..但是遇到了一个问题..假设列名有一些空值..那么 where 条件查询不起作用.. @VishnuK 好的,如果不为空,查询不起作用是什么意思?您是否收到任何错误或您想排除 NULL 值?您需要做的就是,如果您想删除 NULLS,只需添加一个 AND your_column IS NOT NULL 只是连接问题。但感谢您的解决方案.. 我刚看到你的博客。它很有帮助。【参考方案2】:
select * from table_Name where lower(name) ="red"

select * from table_Name where upper(name) ="RED"

这不能使用name 上的索引。根据所使用的表达式创建基于函数的索引可能是合适的。

【讨论】:

以上是关于如何在 oracle sql 数据库中使 WHERE 子句不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 中使可空列不为空

oracle数据库中sql%notfound的用法

Oracle AQ c#并在c#中从oracle队列中使消息出队

sql语句执行顺序、

Oracle锁表解锁

Java中sql语句的引号问题