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

时间:2018-08-15 05:28:03

标签: sql sql-server oracle hana case-sensitive

在where子句中不使用函数的不区分大小写的任何方法?
请指定您在何时/是否答复的数据库。我知道默认情况下MySQL已经不区分大小写。 Oracle,MSSQL或HANA呢?

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

5 个答案:

答案 0 :(得分:4)

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;

Find a demo here

答案 1 :(得分:4)

由于您的问题被标记为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

更常见

答案 2 :(得分:0)

使显示的列大写(或小写)以进行比较是使大小写不敏感的比较的标准方法。 (UPPERLOWER是SQL标准中定义的函数。)

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

这取决于您所使用的DBMS及其版本在多大程度上支持该标准。例如,在Oracle中,它是SUBSTR而不是SUBSTRING,是LENGTH而不是CHAR_LENGTH。另一方面,MySQL直接具有SUBSTRINGCHAR_LENGTH的功能,但仅从8.0版开始支持递归查询。

答案 3 :(得分:0)

这将起作用:

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

答案 4 :(得分:0)

Oracle 12c答案

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

SAP HANA似乎没有其他方法可以使用上限或下限。

SQL Server和MySQL不区分大小写字母-默认情况下,它们不区分大小写。