Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle DB:如何编写查询忽略案例?_Sql_Database_Oracle - Fatal编程技术网

Sql Oracle DB:如何编写查询忽略案例?

Sql Oracle DB:如何编写查询忽略案例?,sql,database,oracle,Sql,Database,Oracle,正如我在标题中所写,我有SQL查询,在Oracle DB上运行,假设: SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe' 如果我想,查询将返回IGNORECASE、IGNORECASE或它们的组合,那么如何才能做到这一点 这可能吗?您可以在where条件的两侧使用lower或upper功能 Select * from table where upper(table.name) like upper('IgNoreCaSe'); 或者

正如我在标题中所写,我有SQL查询,在Oracle DB上运行,假设:

SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'
如果我想,查询将返回IGNORECASE、IGNORECASE或它们的组合,那么如何才能做到这一点


这可能吗?

您可以在where条件的两侧使用lower或upper功能

Select * from table where upper(table.name) like upper('IgNoreCaSe');

或者,用lower代替upper。

您可以在查询中使用upper函数,为了提高性能,可以使用函数基索引

 CREATE INDEX upper_index_name ON table(upper(name))

使用ALTER SESSION语句将比较设置为不区分大小写:

alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;
如果您仍在使用10gR2版本,请使用以下语句。看


…还可以在查询外部执行到上限或下限的转换:

tableName:= UPPER(someValue || '%');


您还可以使用正则表达式:

SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');

也不要忘记显而易见的一点,表格中的数据是否需要有大小写?您只能插入已使用小写的行,或将现有的DB行转换为小写,并从一开始就使用它。

您可以使用大写或小写函数将两个值转换为大写或小写:

Select * from table where upper(table.name) like upper('IgNoreCaSe')


在12.2及更高版本中,使查询不区分大小写的最简单方法是:

从TABLE.NAME整理二进制_CI(如“IgNoReCaSe”)的表中选择*
谢谢你这么快的回答。我想知道,因为我的查询从一个非常大的表中选择了大约12个字段,所以我需要大约20次使用upper函数——这会不会对性能造成影响?如果您知道要检查的确切单词,您可以使用语句中的SELECT*from表,其中UPPERNAME在upper'Name1',upper'Name2';或者,如果名称都以相同的开头,您可以使用通配符SELECT*从表中选择,其中UPPERNAME类似于UPPER'Search%';如果您谈论的是Oracle执行操作所需的时间,那么像upper这样的函数的使用永远不会影响性能—cpu执行转换所需的时间与从缓存加载数据页所需的时间相比微不足道,更不用说从磁盘获取数据页了。但是,使用lower或upper将阻止查询在这些列上使用任何索引,除非您创建了使用这些函数的索引。但是LIKE也可能会阻止索引的使用,特别是当表达式中的第一个字符是通配符时。如果zerodesible在10gR2或更高版本上,这比基于函数的索引要好得多,因为它将覆盖查询中的所有12个字段,而不会增加所有这些索引的开销。一个潜在的问题是用户每次都需要更改会话。我不确定您所说的开销是多少。如果创建一个普通索引,然后更改NLS_COMP和NLS_排序,Oracle将无法再使用该索引查找相关数据。因此,您最终将创建NLS,为任何合适的列设置特定的索引。对于我来说,这并不清楚如何比基于函数的索引产生更多或更少的开销。显然,如果希望所有查询都不区分大小写,则不需要在列上维护索引,在上列上维护FBI,也不需要为不同的NL维护索引settings@devio在版本12c中对我有用吗?请更新你的答案。如果你有专有名词,这是一个问题。特别是如果在同一个字段中同时包含专有名词和非专有名词,这可能是正确的答案,但请注意,这可能会破坏字符串上的任何索引。如果需要索引,您可能希望添加一个新列,在该列中始终插入大小写规范化值?大写字母可以匹配但小写字母不匹配吗?我认为@user3666177发布了or来演示这两个选项。我认为一个不可能匹配另一个。好建议!您能否提供一个关于如何使用索引执行搜索的示例?
SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');
Select * from table where upper(table.name) like upper('IgNoreCaSe')
Select * from table where lower(table.name) like lower('IgNoreCaSe');