不在 where 子句中使用函数的不区分大小写的搜索

Case insensitive search without using a function in the where clause

有什么方法可以在不使用 where 子句中的函数的情况下使大小写不敏感?
请指定您正在谈论的数据库when/if 您回复。我知道 MySQL 默认情况下已经不区分大小写。 Oracle 或 MSSQL 或 HANA 怎么样?

select * from mytable WHERE upper(fieldname) = 'VALUE'

collate SQL_Latin1_General_CP1_CS_AS.

默认排序规则是 SQL_Latin1_General_CP1_CI_AScase insensitive。如果我们需要让它区分大小写,那么添加 COLLATE Latin1_General_CS_AS 会使搜索区分大小写。

查询

select * from [mytable] 
where [fieldname] = 'VALUE' collate SQL_Latin1_General_CP1_CS_AS;

Find a demo here

由于您的问题被标记为 Oracle,我将提供一个适用于 Oracle 的解决方案。

您可以为不区分大小写的搜索设置这些会话参数

SQL> alter session set NLS_COMP=ANSI;
SQL> alter session set NLS_SORT=BINARY_CI; 
SQL> select 1 from DUAL where 'abc' = 'ABC';

         1
----------
         1

Linguistic Sorting and String Searching

阅读更多内容

正如@mathguy 指出的那样,

ALTER SESSION SET NLS_COMP=LINGUISTIC; 

比使用 ANSI

更常见

按照您显示的方式将列设为大写(或小写)以便进行比较,这是进行不区分大小写比较的标准方法。 (UPPERLOWER 是 SQL 标准中定义的函数。)

如果你不想在列上应用函数,那么你当然可以编写一个递归查询来生成值的所有 upper/lower 个案例排列('VALUE','vALUE', 'VaLUE', ..., 'value') 并检查您的列值是否在此集合中。标准 SQL 提供用于访问子字符串(例如第 n 个字母)的 SUBSTRING 函数和用于获取字符串长度的 CHAR_LENGTH

这取决于您使用的 DBMS 及其版本对标准的支持程度。例如在 Oracle 中它是 SUBSTR 而不是 SUBSTRINGLENGTH 而不是 CHAR_LENGTH。另一方面,MySQL 直接具有 SUBSTRINGCHAR_LENGTH,但仅支持 8.0 版的递归查询。

这会起作用:

SELECT *
FROM mytable
WHERE REGEXP_LIKE (column_name, 'value', 'i');

Oracle 12c 答案

select * from mytable WHERE fieldname='Value' collate binary_ci

SAP HANA 除了使用 upper 或 lower 似乎没有别的办法。

SQL 服务器和MySQL 不区分大小写字母-它们默认不区分大小写。

可以使用 CONTAINS 函数。例如,Microsoft SQL 服务器查询:

SELECT    * 
FROM      TableName 
WHERE     ColumnName LIKE 'Abc%'

可能在 SAP HANA 中写成:

SELECT    * 
FROM      TableName 
WHERE     CONTAINS(ColumnName,'Abc%');

https://help.sap.com/viewer/05c9edaee7fe4d28ab3627d0b1583df6/2021_01_QRC/en-US/b45ff4c0e9ab4ba7a9e18a2552adeb3d.html