SQL服务器忽略在其中表达的情况下

问题描述 投票:77回答:7

如何构造一个SQL查询(MS SQL服务器)里的“where”子句是不区分大小写?

SELECT * FROM myTable WHERE myField = 'sOmeVal'

我想要的结果回来忽略大小写

sql sql-server where-clause case-insensitive
7个回答
121
投票

在SQL Server数据库的默认配置,字符串比较不区分大小写。如果你的数据库覆盖此设置(通过使用替代归类的),那么你就需要指定什么样的整理,以在查询中使用。

SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS

请注意,我所提供的整理只是一个例子(尽管它更比可能将功能就好了你)。 SQL Server排序规则的更彻底的轮廓可以发现here


28
投票

通常情况下,字符串比较不区分大小写。如果您的数据库配置为区分大小写排序,您需要强制使用不区分大小写之一:

SELECT balance FROM people WHERE email = '[email protected]'
  COLLATE SQL_Latin1_General_CP1_CI_AS 

20
投票

我发现了另一个解决方案的其他地方;也就是说,使用

upper(@yourString)

但每个人都在这里是说,在SQL Server中,这并不重要,因为它无论如何忽略大小写?我敢肯定我们的数据库是区分大小写的。


7
投票

没有,只有使用LIKE将无法正常工作。 LIKE搜索完全匹配您给定的模式值。在这种情况下LIKE会发现只有文本“sOmeVal”而不是“someval”。

甲pracitcable溶液是使用LCASE()功能。 LCASE('sOmeVal')得到您的文本字符串小写:“someval”。如果您使用此功能,您两侧对比,它的工作原理:

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

声明比较两个字符串小写字母,让你的“sOmeVal”将“someval”(如“Someval”,“sOMEVAl”等)的所有其他符号匹配。


7
投票

前2回答(从Adam RobinsonAndrejs Cainikovs)是有点儿,八九不离十是正确的,在他们的工作技术,但他们的解释是错误的,因此可能在很多情况下会产生误导。例如,而SQL_Latin1_General_CP1_CI_AS整理在许多情况下工作,它不应该被认为是适当的区分大小写排序。事实上,考虑到OP是与区分大小写(或可能二进制)归类的数据库的工作,我们知道OP没有使用排序规则是这么安装的默认(尤其是操作系统上的任何安装使用美国英语作为语言):SQL_Latin1_General_CP1_CI_AS。当然,在OP可以使用SQL_Latin1_General_CP1_CS_AS,但VARCHAR数据时,重要的是不会改变的代码页,因为它可能会导致数据丢失,由核对(即Latin1_General VS法国的语言环境/文化控制VS希伯来语等)。请参考下面点#9。

其他四个答案都是错误的程度不同。

我会澄清所有的误会这里,使读者能够有希望做出最合适/有效的选择。

  1. 不要使用UPPER()。这是完全没有必要的额外工作。使用COLLATE条款。字符串比较需要在任一情况下需要做,但使用UPPER()还具有通过字符来检查,字符,以查看是否有一个大写映射,然后改变它。而你需要做的这两面。添加COLLATE简单地指引处理,以产生使用一套不同的规则,而不是它在默认情况下将排序键。使用COLLATE肯定是更有效(或“高性能”,如果你喜欢的话:)比使用UPPER(),如本test script (on PasteBin)证明。 还有一个问题noted by @Ceisc on @Danny's answer: 在某些语言大小写转换不往返。即LOWER(X)!= LOWER(UPPER(X))。 土耳其大写“I”是常见的例子。
  2. 没有,整理不是一个数据库范围的设置,至少不会在这方面。有一个数据库级别的默认排序规则,它被用作默认的改变和新创建的列不指定COLLATE条款(这很可能是其中这一普遍的误解来自于),但它不会,除非你直接影响查询在比较字符串文字和变量其他字符串常量和变量,或者你正在引用数据库级元数据。
  3. 不,整理是不是每个查询。
  4. 归类为每谓词(即操作数的东西的东西)或表达,而不是每个查询。这是整个查询,而不只是WHERE条款真。这包括联接,GROUP BY,ORDER BY PARTITION BY等等。
  5. 不,没有转换为VARBINARY(e.g.convert(varbinary, myField) = convert(varbinary, 'sOmeVal')),原因如下: 这是一个二进制比较,这是不区分大小写的(这是什么这个问题是要求) 如果你想有一个二进制比较,使用二进制排序规则。使用一个,如果你使用的是SQL Server 2008或更新与_BIN2结束,否则你没有选择,只能使用一个与_BIN结束。如果数据是NVARCHAR那么它并不重要的语言环境中使用,因为它们是在这种情况下都是一样的,因此Latin1_General_100_BIN2总是工作。如果数据是VARCHAR,你必须,因为语言环境决定了所使用的代码页,并改变代码页可以改变数据使用的数据是目前在(如Latin1_GeneralFrenchJapanese_XJIS等)相同的区域(即数据失利)。 使用可变长度的数据类型,而无需指定大小将依赖于默认大小,并有不同的地方是所使用的数据类型的上下文两个不同的默认值。它是1或30,用于字符串类型。当CONVERT()中,它将使用30默认值。危险的是,如果字符串可以超过30个字节,它会变得悄无声息截断,你可能会得到来自这个谓词不正确的结果。 即使你想一个区分大小写的比较,binary collations are not case-sensitive(另一种非常常见的误解)。
  6. 不,LIKE并不总是区分大小写。如果一个变量进行比较,一个字符串,或者通过可选的COLLATE子句中指定的核对它使用的列的被引用的整理,或数据库的归类。
  7. LCASE是不是SQL Server功能。这似乎是Oracle或MySQL的。或可能的Visual Basic?
  8. 由于问题的上下文中的列比较字符串文字,无论是实例的核对(通常被称为“服务器”),也不是数据库的排序规则在这里的任何直接的影响。归类是存储在每个每一列,每一列都可以有不同的排序规则,而那些归类并不需要是相同的数据库的默认排序规则或实例的排序规则。当然,该实例的排序规则是为了什么新创建的数据库将作为其默认排序规则,如果在创建数据库时未指定COLLATE条款是使用默认值。同样地,数据库的默认排序规则是,如果未指定COLLATE子句改变或新创建的列会用什么。
  9. 您应该使用不区分大小写的排序规则,否则相同列的排序规则。使用以下查询找到列的排序规则(修改表的名称和架构名称): SELECT col.* FROM sys.columns col WHERE col.[object_id] = OBJECT_ID(N'dbo.TableName') AND col.[collation_name] IS NOT NULL; 然后,只需改变_CS_CI。所以,Latin1_General_100_CS_AS将成为Latin1_General_100_CI_AS。 如果列是使用二进制排序(在_BIN_BIN2结束),然后使用以下查询找到类似的归类: SELECT * FROM sys.fn_helpcollations() col WHERE col.[name] LIKE N'{CurrentCollationMinus"_BIN"}[_]CI[_]%'; 例如,假设该列是使用Japanese_XJIS_100_BIN2,操作如下: SELECT * FROM sys.fn_helpcollations() col WHERE col.[name] LIKE N'Japanese_XJIS_100[_]CI[_]%';

有关排序规则的更多信息,编码等信息,请访问:Collations Info


3
投票

您可以强制区分大小写,铸造那样的VARBINARY:

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')

2
投票

你是什​​么数据库?随着MS SQL Server中,这是一个数据库范围的设置,或与COLLATE关键字,你可以过骑它每个查询。

© www.soinside.com 2019 - 2024. All rights reserved.