如何构造一个SQL查询(MS SQL服务器)里的“where”子句是不区分大小写?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
我想要的结果回来忽略大小写
在SQL Server数据库的默认配置,字符串比较不区分大小写。如果你的数据库覆盖此设置(通过使用替代归类的),那么你就需要指定什么样的整理,以在查询中使用。
SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS
请注意,我所提供的整理只是一个例子(尽管它更比可能将功能就好了你)。 SQL Server排序规则的更彻底的轮廓可以发现here。
通常情况下,字符串比较不区分大小写。如果您的数据库配置为区分大小写排序,您需要强制使用不区分大小写之一:
SELECT balance FROM people WHERE email = '[email protected]'
COLLATE SQL_Latin1_General_CP1_CI_AS
我发现了另一个解决方案的其他地方;也就是说,使用
upper(@yourString)
但每个人都在这里是说,在SQL Server中,这并不重要,因为它无论如何忽略大小写?我敢肯定我们的数据库是区分大小写的。
没有,只有使用LIKE
将无法正常工作。 LIKE
搜索完全匹配您给定的模式值。在这种情况下LIKE
会发现只有文本“sOmeVal”而不是“someval”。
甲pracitcable溶液是使用LCASE()
功能。 LCASE('sOmeVal')
得到您的文本字符串小写:“someval”。如果您使用此功能,您两侧对比,它的工作原理:
SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')
声明比较两个字符串小写字母,让你的“sOmeVal”将“someval”(如“Someval”,“sOMEVAl”等)的所有其他符号匹配。
前2回答(从Adam Robinson和Andrejs 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。
其他四个答案都是错误的程度不同。
我会澄清所有的误会这里,使读者能够有希望做出最合适/有效的选择。
UPPER()
。这是完全没有必要的额外工作。使用COLLATE
条款。字符串比较需要在任一情况下需要做,但使用UPPER()
还具有通过字符来检查,字符,以查看是否有一个大写映射,然后改变它。而你需要做的这两面。添加COLLATE
简单地指引处理,以产生使用一套不同的规则,而不是它在默认情况下将排序键。使用COLLATE
肯定是更有效(或“高性能”,如果你喜欢的话:)比使用UPPER()
,如本test script (on PasteBin)证明。
还有一个问题noted by @Ceisc on @Danny's answer:
在某些语言大小写转换不往返。即LOWER(X)!= LOWER(UPPER(X))。
土耳其大写“I”是常见的例子。COLLATE
条款(这很可能是其中这一普遍的误解来自于),但它不会,除非你直接影响查询在比较字符串文字和变量其他字符串常量和变量,或者你正在引用数据库级元数据。WHERE
条款真。这包括联接,GROUP BY,ORDER BY PARTITION BY等等。VARBINARY
(e.g.convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
),原因如下:
这是一个二进制比较,这是不区分大小写的(这是什么这个问题是要求)
如果你想有一个二进制比较,使用二进制排序规则。使用一个,如果你使用的是SQL Server 2008或更新与_BIN2
结束,否则你没有选择,只能使用一个与_BIN
结束。如果数据是NVARCHAR
那么它并不重要的语言环境中使用,因为它们是在这种情况下都是一样的,因此Latin1_General_100_BIN2
总是工作。如果数据是VARCHAR
,你必须,因为语言环境决定了所使用的代码页,并改变代码页可以改变数据使用的数据是目前在(如Latin1_General
,French
,Japanese_XJIS
等)相同的区域(即数据失利)。
使用可变长度的数据类型,而无需指定大小将依赖于默认大小,并有不同的地方是所使用的数据类型的上下文两个不同的默认值。它是1或30,用于字符串类型。当CONVERT()
中,它将使用30默认值。危险的是,如果字符串可以超过30个字节,它会变得悄无声息截断,你可能会得到来自这个谓词不正确的结果。
即使你想一个区分大小写的比较,binary collations are not case-sensitive(另一种非常常见的误解)。LIKE
并不总是区分大小写。如果一个变量进行比较,一个字符串,或者通过可选的COLLATE
子句中指定的核对它使用的列的被引用的整理,或数据库的归类。LCASE
是不是SQL Server功能。这似乎是Oracle或MySQL的。或可能的Visual Basic?COLLATE
条款是使用默认值。同样地,数据库的默认排序规则是,如果未指定COLLATE
子句改变或新创建的列会用什么。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
您可以强制区分大小写,铸造那样的VARBINARY:
SELECT * FROM myTable
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
你是什么数据库?随着MS SQL Server中,这是一个数据库范围的设置,或与COLLATE关键字,你可以过骑它每个查询。