不在 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_AS
即 case insensitive
。如果我们需要让它区分大小写,那么添加 COLLATE Latin1_General_CS_AS
会使搜索区分大小写。
查询
select * from [mytable]
where [fieldname] = 'VALUE' collate SQL_Latin1_General_CP1_CS_AS;
由于您的问题被标记为 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
更常见
按照您显示的方式将列设为大写(或小写)以便进行比较,这是进行不区分大小写比较的标准方法。 (UPPER
和 LOWER
是 SQL 标准中定义的函数。)
如果你不想在列上应用函数,那么你当然可以编写一个递归查询来生成值的所有 upper/lower 个案例排列('VALUE','vALUE', 'VaLUE', ..., 'value') 并检查您的列值是否在此集合中。标准 SQL 提供用于访问子字符串(例如第 n 个字母)的 SUBSTRING
函数和用于获取字符串长度的 CHAR_LENGTH
。
这取决于您使用的 DBMS 及其版本对标准的支持程度。例如在 Oracle 中它是 SUBSTR
而不是 SUBSTRING
和 LENGTH
而不是 CHAR_LENGTH
。另一方面,MySQL 直接具有 SUBSTRING
和 CHAR_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%');
有什么方法可以在不使用 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_AS
即 case insensitive
。如果我们需要让它区分大小写,那么添加 COLLATE Latin1_General_CS_AS
会使搜索区分大小写。
查询
select * from [mytable]
where [fieldname] = 'VALUE' collate SQL_Latin1_General_CP1_CS_AS;
由于您的问题被标记为 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
更常见按照您显示的方式将列设为大写(或小写)以便进行比较,这是进行不区分大小写比较的标准方法。 (UPPER
和 LOWER
是 SQL 标准中定义的函数。)
如果你不想在列上应用函数,那么你当然可以编写一个递归查询来生成值的所有 upper/lower 个案例排列('VALUE','vALUE', 'VaLUE', ..., 'value') 并检查您的列值是否在此集合中。标准 SQL 提供用于访问子字符串(例如第 n 个字母)的 SUBSTRING
函数和用于获取字符串长度的 CHAR_LENGTH
。
这取决于您使用的 DBMS 及其版本对标准的支持程度。例如在 Oracle 中它是 SUBSTR
而不是 SUBSTRING
和 LENGTH
而不是 CHAR_LENGTH
。另一方面,MySQL 直接具有 SUBSTRING
和 CHAR_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%');