Sql 比较Oracle中的字符串

Sql 比较Oracle中的字符串,sql,oracle,comparison,Sql,Oracle,Comparison,我需要查询一个表,查找给定字符串的值。该表区分大小写,但我想在比较中使用ToLower() 假设我有一个包含以下数据的classes表 class teacher ----------------- Mat101 Smith MAT101 Jones mat101 Abram ENG102 Smith 我的问题应该是 Select teacher From classes where lower(class) = 'math101' 这是进行比较的最佳方式吗 更新 我无

我需要查询一个表,查找给定字符串的值。该表区分大小写,但我想在比较中使用ToLower()

假设我有一个包含以下数据的classes表

class    teacher
-----------------
Mat101   Smith
MAT101   Jones
mat101   Abram
ENG102   Smith
我的问题应该是

Select teacher From classes where lower(class) = 'math101'
这是进行比较的最佳方式吗

更新
我无法控制数据库或数据。我是一个只读消费者。

您所说的这种查询的缺点是它不能在类上使用索引(作为索引查找,也就是说,它仍然可以用于索引的快速完全扫描)


不过,在Oracle的现代版本中,您可以在较低的(类)上创建索引,然后此查询可以使用该索引。

以下是有关基于函数的索引的更多信息(Dave在上面提到的内容):


否;更好的做法是改进数据:创建一个数字ID来表示类的这些看似无意义的变化(可能还有一个关联的查找表来获取ID)。在where子句中使用ID列,您应该找到一个索引数字列

如果没有选择,考虑基于函数的索引(下级)。< /P>

如果这不是一个选项,那么“最佳”的问题与性能严格相关,考虑反规范化和添加包含低级(类)的列,可能包含触发器。

如果这不是一个选项,则更新数据,使其全部为小写(并采取措施仅插入/更新小写类数据)

如果你不能像那样更新数据,那么答案是“可能”


在任何情况下,如果没有测试列的索引,就不能称之为最佳方法。

此方法要求运行10gr2或更高版本

更改会话前:

SQL> WITH LETTERS AS
  2  (SELECT 'a' LETTER FROM DUAL UNION ALL
  3   SELECT 'b' LETTER FROM DUAL UNION ALL
  4   SELECT 'A' LETTER FROM DUAL UNION ALL
  5   SELECT 'B' LETTER FROM DUAL) 
  6  SELECT LETTER FROM LETTERS 
  7  WHERE LETTER = 'A';

L
-
A

SQL> 
如果您能够更改会话,则可以执行以下操作:

SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;

Session altered.

SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;

Session altered.

SQL> WITH LETTERS AS
  2  (SELECT 'a' LETTER FROM DUAL UNION ALL
  3   SELECT 'b' LETTER FROM DUAL UNION ALL
  4   SELECT 'A' LETTER FROM DUAL UNION ALL
  5   SELECT 'B' LETTER FROM DUAL) 
  6  SELECT LETTER FROM LETTERS 
  7  WHERE LETTER = 'A';

L
-
a
A
如上所述更改会话会导致数据库将同一字母的大写和小写版本作为等效对象进行排序和比较。有关更多信息,请参阅

嗯,, Gabe

如果变量(Mat101、Mat101、Mat101)引用相同的内容,则它们应该具有相同的标识符

取决于数据量、更新频率、查询等,您可以考虑将数据复制到一个数据库中,该数据库使用复制到复制中的清理/标准化阶段进行控制。 当你说“我无法控制数据库”时,如果你可以查询,你将对数据库产生影响。有人控制了数据库,可能值得一封电子邮件/一通电话说,如果他们在该列中添加较低的()索引,那么这将减少您的查询对数据库的影响

最后,如果变体足够简单,那么您可以尝试

Select teacher From classes where class in (lower('mat101'), upper('mat101'), initcap('mat1010')). 

由于您添加了您是数据库的只读用户,因此最佳方法与您开始使用的方法非常接近:

Select teacher From classes where lower(class) = LOWER('math101')

注意,我在输入参数中添加了LOWER(),只是为了确保它也是小写的。有些人可能会称之为“皮带和吊带”(又名redudant);我称之为良好的防御性编程。

这是一个巧妙的技巧,但与使用LOWER(column)=“mystring”相比,它有什么好处?它能够在列上使用索引吗?只有在使用NLSSORT设置创建索引时才可以