如何比较字符串,使得仅当每个字符串的大小写相同时比较才为真。例如:
Select * from a_table where attribute = 'k'
将返回一个带有属性'K'的行。我不想要这种行为。
如何比较字符串,使得仅当每个字符串的大小写相同时比较才为真。例如:
Select * from a_table where attribute = 'k'
将返回一个带有属性'K'的行。我不想要这种行为。
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS
事情成了。
Latin1_General_CS_AS
是排序规则的一种规范。排序规则是一组规则,用于确定数据如何排序和比较。有关更多信息,请参见此页面:http://www.databasejournal.com/features/mssql/article.php/3302341/SQL-Server-and-Collation.htm。 - amccormackALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS
现在您的搜索将是区分大小写的。
如果您想再次使该列 不区分大小写,那么请使用
ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
您可以轻松地将列转换为VARBINARY(最大长度),长度必须是您预期的最大值,以避免比较缺陷,只需将长度设置为列长度即可。Trim列可以帮助您比较除空格以外的实际值,在您的表列中具有意义和价值。这是一个简单的示例,您可以看到我先Trim列的值,然后进行转换和比较。
CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))
希望这可以帮到你。另一种选择是使用HASHBYTES,类似于这样:
SELECT *
FROM a_table
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
简化通用答案:
SQL区分大小写的字符串比较
以下示例可能会有所帮助:
Declare @S1 varchar(20) = 'SQL'
Declare @S2 varchar(20) = 'sql'
if @S1 = @S2 print 'equal!' else print 'NOT equal!' -- equal (default non-case sensitivity for SQL
if cast(@S1 as binary) = cast(Upper(@S2) as binary) print 'equal!' else print 'NOT equal!' -- equal
if cast(@S1 as binary) = cast(@S2 as binary) print 'equal!' else print 'NOT equal!' -- not equal
if @S1 COLLATE Latin1_General_CS_AS = Upper(@S2) COLLATE Latin1_General_CS_AS print 'equal!' else print 'NOT equal!' -- equal
if @S1 COLLATE Latin1_General_CS_AS = @S2 COLLATE Latin1_General_CS_AS print 'equal!' else print 'NOT equal!' -- not equal
相比于像运行时计算hashbytes这样的方法,转换可能更有效率,我期望排序规则甚至更快。
您可以将属性
定义为BINARY
,或使用INSTR
或STRCMP
来执行搜索。
INSTR
和STRCMP
函数。 - Jonas